Прокручування через C ++ через карту


216

Я хочу повторити кожен елемент у, map<string, int>не знаючи жодного з його рядкових значень чи ключів.

Що я маю досі:

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
Можливий дублікат способу
переходу

Відповіді:


490

Ви можете досягти цього, наприклад:

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

З C ++ 11 (і далі) ,

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

З C ++ 17 (і далі) ,

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

7
додайте тип "auto" перед "it"
iedoc

2
@ P0W Чому "auto const &" для C ++ 11, але "const auto &" для C ++ 17? Будь-яка різниця між "auto const &" і "const auto &"?
Ерік

35
Різниці немає, це лише питання смаку. Однак здається, що смак @ P0W не дуже стійкий ...
Kapichu

15
Дякуємо за оновлення C ++ 17, я шукав auto const& [key, val] : symbolTableформат!
Вода

3
@haram Можливо, вам доведеться встановити "ISO C ++ 17 Standard (/ std: c ++ 17)" у налаштуваннях проекту (Властивості конфігурації> C / C ++> Мова> C ++ Language Standard)
Swordfish

27

Спробуйте наступне

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

Те саме можна записати, використовуючи звичайну для циклу

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

Враховуйте, що value_type для std::mapвизначається наступним чином

typedef pair<const Key, T> value_type

Таким чином, у моєму прикладі p - це посилання const на тип value_type, де Key std::stringі T єint

Також було б краще, якщо функція буде оголошена як

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

14

value_typeУ А mapє pairщо містить ключ і значення , як це firstі secondчлена, відповідно.

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

Або з C ++ 11, використовуючи діапазон на основі:

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

7

Як говорить @Vlad з Москви, врахуйте, що value_typeдля std::mapвизначення визначається наступним чином:

typedef pair<const Key, T> value_type

Тоді це означає, що якщо ви хочете замінити ключове слово autoна більш явний специфікатор типу, ви можете це зробити;

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

Просто для розуміння того auto, що в даному випадку буде перекладено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.