C ++ Loop through Map

217

Я хочу перебрать каждый элемент, map<string, int>не зная ни одного из его значений или ключей 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
Возможный дубликат Как пройти по карте c ++
amanuel2

Ответы:

491

Вы можете достичь этого следующим образом:

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 ;
}
P0W
источник
7
добавьте тип "auto" перед "it"
iedoc
2
@ P0W Почему «auto const &» для C ++ 11, а «const auto &» для C ++ 17? Есть ли разница между "auto const &" и "const auto &"?
Эрик
35
Нет разницы, это просто вопрос вкуса. Однако кажется, что вкус @ P0W не очень постоянен ...
Капичу
15
Спасибо за обновление с C ++ 17, я искал auto const& [key, val] : symbolTableформат!
Вода
3
@haram Возможно, вам придется установить «Стандарт ISO C ++ 17 (/ std: c ++ 17)» в настройках проекта (Свойства конфигурации> C / C ++> Язык> Стандарт языка C ++)
Swordfish
27

Попробуйте следующее

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

То же самое можно написать с помощью обычного цикла for

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 является константной ссылкой на 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';
}
Columbo
источник
7

Как говорит @Vlad из Москвы, учтите, что value_typefor 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будет переводиться в этом случае.

Джон Мутума
источник