С++ Loop через карту
Я хочу перебирать каждый элемент в 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?
}
}
Ответы
Ответ 1
Это можно сделать следующим образом:
map<string, int>::iterator it;
for ( it = symbolTable.begin(); it != symbolTable.end(); it++ )
{
std::cout << it->first // string (key)
<< ':'
<< it->second // string value
<< std::endl ;
}
С С++ 11 (и далее),
for (auto const& x : symbolTable)
{
std::cout << x.first // string (key)
<< ':'
<< x.second // string value
<< std::endl ;
}
С С++ 17 (и далее),
for( auto const& [key, val] : symbolTable )
{
std::cout << key // string (key)
<< ':'
<< val // string value
<< std::endl ;
}
Ответ 2
Попробуйте выполнить
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 является константой ссылки на value_type, где Key std::string
, а T - int
Также было бы лучше, если бы функция была объявлена как
void output( const map<string, int> &table );
Ответ 3
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';
}
Или с С++ 11, используя диапазон для:
for (auto const& p : symbolTable)
{
std::cout << p.first << ' ' << p.second << '\n';
}