C ++ Loop through Map

216

Saya ingin mengulangi setiap elemen dalam map<string, int>tanpa mengetahui nilai atau kunci string-intnya.

Apa yang saya miliki sejauh ini:

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?  
       }
}
Tanpa nama
sumber
3
Kemungkinan duplikat dari Bagaimana untuk mengulang melalui peta c ++
amanuel2

Jawaban:

491

Anda dapat mencapai ini seperti berikut:

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 ;
}

Dengan C ++ 11 (dan seterusnya) ,

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

Dengan C ++ 17 (dan seterusnya) ,

for( auto const& [key, val] : symbolTable )
{
    std::cout << key         // string (key)
              << ':'  
              << val        // string's value
              << std::endl ;
}
P0W
sumber
7
tambahkan tipe "auto" di depan "it"
iedoc
2
@ P0W Mengapa "auto const &" untuk C ++ 11 tetapi "const auto &" untuk C ++ 17? Adakah perbedaan antara "const auto &" dan "const auto &"?
Eric
35
Tidak ada perbedaan, itu hanya masalah selera. Namun sepertinya rasa @ P0W tidak terlalu konsisten ...
Kapichu
15
Terima kasih telah memperbarui dengan C ++ 17, saya mencari auto const& [key, val] : symbolTableformatnya!
Air
3
@haram Anda mungkin harus menetapkan "Standar ISO C ++ 17 (/ std: c ++ 17)" di pengaturan proyek (Properti Konfigurasi> C / C ++> Bahasa> Standar Bahasa C ++)
Swordfish
27

Coba yang berikut ini

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

Hal yang sama dapat ditulis menggunakan loop biasa

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

Mempertimbangkan bahwa value_type untuk std::mapdidefinisikan dengan cara berikut

typedef pair<const Key, T> value_type

Jadi dalam contoh saya p adalah referensi const ke value_type di mana Key adalah std::stringdan T adalahint

Juga akan lebih baik jika fungsi tersebut dideklarasikan sebagai

void output( const map<string, int> &table );
Vlad dari Moskow
sumber
14

The value_typedari mapadalah pairyang berisi kunci dan nilai seperti ini firstdan secondanggota masing-masing.

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

Atau dengan C ++ 11, menggunakan rentang berbasis untuk:

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

Seperti @Vlad dari Moskow katakan, Memperhitungkan bahwa value_typeuntuk std::mapdidefinisikan dengan cara berikut:

typedef pair<const Key, T> value_type

Ini berarti bahwa jika Anda ingin mengganti kata kunci autodengan specifier tipe yang lebih eksplisit, maka Anda dapat melakukannya;

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

Hanya untuk memahami apa yang autoakan diterjemahkan ke dalam kasus ini.

John Mutuma
sumber