Harita Üzerinden C ++ Döngüsü


216

Ben map<string, int>onun dize int değerleri veya anahtarları bilmeden her öğeyi yineleme istiyorum .

Şimdiye kadar ne var:

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

Yanıtlar:


491

Bunu aşağıdaki gibi başarabilirsiniz:

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

İle C ++ 11 (ve sonrası) ,

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

İle C ++ 17 (ve sonrası) ,

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

7
"it" in önüne "auto" türünü ekle
iedoc

2
@ P0W Neden C ++ 11 için "otomatik const" ama C ++ 17 için "const otomatik &"? "Auto const &" ve "const auto &" arasında herhangi bir fark var mı?
Eric

35
Fark yok, sadece bir zevk meselesi. Ancak @ P0W tadı çok tutarlı değil gibi görünüyor ...
Kapichu

15
C ++ 17 ile güncellediğiniz için teşekkürler, auto const& [key, val] : symbolTableformatı arıyordum !
Su

3
@haram Proje ayarlarında "ISO C ++ 17 Standardı (/ std: c ++ 17)" ayarlamanız gerekebilir (Yapılandırma Özellikleri> C / C ++> Dil> C ++ Dil Standardı)
Kılıç Balığı

27

Takip etmeyi dene

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

Aynısı sıradan bir döngü kullanarak yazılabilir

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

Değer_türünün std::mapşu şekilde tanımlandığını dikkate alın

typedef pair<const Key, T> value_type

Dolayısıyla benim örneğimde p, Key'in std::stringve T'ninint

Ayrıca, fonksiyonun

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

14

value_typeA mapa, pairs olarak anahtar ve değerini içeren firstve secondüyesinin sırasıyla.

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

Veya aşağıdakiler için aralık tabanlı kullanarak C ++ 11 ile:

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

7

Moskova'dan @Vlad söylediği gibi dikkate alın o value_typeiçin std::mapaşağıdaki yolu tanımlanır:

typedef pair<const Key, T> value_type

Bu, anahtar kelimeyi autodaha açık bir tür belirteciyle değiştirmek isterseniz , bunu yapabileceğiniz anlamına gelir ;

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

Sadece autobu durumda neye tercüme edileceğini anlamak için .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.