Usa un mapa:
Código C++:
Ver original#include <iomanip>
#include <iostream>
#include <map>
int main( )
{
std::map< std::string, int > tablaValores;
tablaValores[ "s123456" ] += 45;
tablaValores[ "s893264" ] += 125;
tablaValores[ "s893264" ] += 32;
tablaValores[ "s123456" ] += 5;
tablaValores[ "s112221" ] += 452;
tablaValores[ "s112221" ] += 30;
tablaValores[ "s893264" ] += 25;
tablaValores[ "s123456" ] += 15;
tablaValores[ "s112221" ] += 1;
tablaValores[ "s135133" ] += 11;
for ( auto it = tablaValores.begin( ); it != tablaValores.end( ); ++it )
{
std::cout << it->first << "_"
<< std::setfill ('0') << std::setw (5) // Esto es solo para rellenar con '0'
<< it->second << std::endl;
}
}
Salida:
Código:
s112221_00483
s123456_00065
s135133_00011
s893264_00182
Si te fijas, el mapa ordena los resultados. Si no deseas esta característica o necesitas que los datos se impriman en el mismo orden que en la entrada.
También puedes, con un poco más de programación, hacer que el mapa ordene según el orden que tu quieres, en este caso el orden sería el de aparición de los códigos.
Para ello necesitamos asociar a cada código un index, esto lo podemos hacer con una clase tal que:
Código C++:
Ver originalclass Clave
{
public:
Clave( const char* codigo )
: _codigo( codigo ),
_index( GetIndex( codigo ) )
{
}
std::string Codigo( ) const
{ return _codigo; }
int Index( ) const
{ return _index; }
private:
static std::vector< std::string > _codigos;
static int GetIndex( const std::string& codigo )
{
auto it = std::find( _codigos.begin( ), _codigos.end( ), codigo );
if ( it == _codigos.end( ) )
{
_codigos.push_back( codigo );
it = _codigos.end( ) - 1;
}
return std::distance( _codigos.begin( ), it );
}
std::string _codigo;
int _index;
};
// Esta línea sirve únicamente para incializar el vector estático de códigos
std::vector< std::string > Clave::_codigos;
Lo que hace básicamente es, al ingresar un código comprueba si dicho código ya tiene un índice asociado, si el índice no existe, crea uno nuevo.
Ahora necesitamos proporcionar al mapa algún mecanismo que permita ordenar los códigos en base a ese index... hay varias opciones para ello. Yo voy a optar por sobrecargar el operador de comparación:
Código C++:
Ver originalbool operator<( const Clave& c1, const Clave& c2 )
{
return c1.Index( ) < c2.Index( );
}
Y ya tenemos todos los ingredientes necesarios. Solo nos falta actualizar la definición del mapa y listo:
Código C++:
Ver originalint main( )
{
std::map< Clave, int > tablaValores;
tablaValores[ "s123456" ] += 45;
tablaValores[ "s893264" ] += 125;
tablaValores[ "s893264" ] += 32;
tablaValores[ "s123456" ] += 5;
tablaValores[ "s112221" ] += 452;
tablaValores[ "s112221" ] += 30;
tablaValores[ "s893264" ] += 25;
tablaValores[ "s123456" ] += 15;
tablaValores[ "s112221" ] += 1;
tablaValores[ "s135133" ] += 11;
for ( auto it = tablaValores.begin( ); it != tablaValores.end( ); ++it )
{
std::cout << it->first << "_"
<< std::setfill ('0') << std::setw (5) // Esto es solo para rellenar con '0'
<< it->second.Codigo( ) << std::endl;
}
}
Salida:
Código:
s123456_00065
s893264_00182
s112221_00483
s135133_00011