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

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

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

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.