C++ цикл через карту
Я хочу перебирать каждый элемент в 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?
}
}
4 ответа:
вы можете достичь этого следующим образом:
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 ; }
попробуйте следующее
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-это ссылка const на value_type, где ключ
std::string
и Тint
также было бы лучше, если бы функция была объявлена как
void output( const map<string, int> &table );
The
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'; }
как говорит @ 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
будет переводить в этом случае.