C ++ Passa attraverso la mappa


216

Voglio iterare attraverso ogni elemento nel map<string, int>senza conoscere nessuno dei suoi valori o chiavi stringa-int.

Quello che ho finora:

void output(map<string, int> table)
{
       map<string, int>::iterator it;
       for (it = table.begin(); it != table.end(); it++)
       {
            //How do I access each element?  
       }
}

3
Possibile duplicato di Come passare in
rassegna

Risposte:


491

Puoi farlo come segue:

map<string, int>::iterator it;

for ( it = symbolTable.begin(); it != symbolTable.end(); it++ )
{
    std::cout << it->first  // string (key)
              << ':'
              << it->second   // string's value 
              << std::endl ;
}

Con C ++ 11 (e successivi) ,

for (auto const& x : symbolTable)
{
    std::cout << x.first  // string (key)
              << ':' 
              << x.second // string's value 
              << std::endl ;
}

Con C ++ 17 (e versioni successive) ,

for( auto const& [key, val] : symbolTable )
{
    std::cout << key         // string (key)
              << ':'  
              << val        // string's value
              << std::endl ;
}

7
aggiungi il tipo "auto" davanti a "it"
iedoc

2
@ P0W Perché "auto const &" per C ++ 11 ma "const auto &" per C ++ 17? Qualche differenza tra "const auto &" e "const auto &"?
Eric

35
Non c'è differenza, è solo una questione di gusti. Tuttavia sembra che il gusto di @ P0W non sia molto coerente ...
Kapichu,

15
Grazie per l'aggiornamento con C ++ 17, stavo cercando il auto const& [key, val] : symbolTableformato!
Acqua

3
@haram Potrebbe essere necessario impostare "ISO C ++ 17 Standard (/ std: c ++ 17)" nelle impostazioni del progetto (Proprietà di configurazione> C / C ++> Lingua> C ++ Language Standard)
Pesce spada

27

Prova quanto segue

for ( const auto &p : table )
{
   std::cout << p.first << '\t' << p.second << std::endl;
} 

Lo stesso può essere scritto usando un normale ciclo for

for ( auto it = table.begin(); it != table.end(); ++it  )
{
   std::cout << it->first << '\t' << it->second << std::endl;
} 

Tenere presente che value_type per std::mapè definito nel modo seguente

typedef pair<const Key, T> value_type

Quindi nel mio esempio p è un riferimento const al valore_tipo in cui Chiave è std::stringe T èint

Inoltre sarebbe meglio se la funzione fosse dichiarata come

void output( const map<string, int> &table );

14

Il simbolo value_typedi a mapè un paircontenente rispettivamente la chiave e il valore in quanto è firste secondmembro.

map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first << ' ' << it->second << '\n';
}

O con C ++ 11, usando range-based per:

for (auto const& p : symbolTable)
{
    std::cout << p.first << ' ' << p.second << '\n';
}

7

Come dice @Vlad da Mosca, tenere presente che value_typeper std::mapè definito nel modo seguente:

typedef pair<const Key, T> value_type

Ciò significa che se si desidera sostituire la parola chiave autocon un identificatore di tipo più esplicito, è possibile farlo;

for ( const pair<const string, int> &p : table ) {
   std::cout << p.first << '\t' << p.second << std::endl;
} 

Solo per capire cosa autosi tradurrà in questo caso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.