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?
}
}
744950 次浏览

你可以这样做:

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

mapvalue_type是一个包含键和值的pair,因为它分别是firstsecond成员。

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

或者在c++ 11中,使用基于范围的for:

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

试试下面的方法

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

请考虑std::map的value_type是按以下方式定义的

typedef pair<const Key, T> value_type

因此,在我的例子中,p是对value_type的const引用,其中Key是std::string, T是int

此外,如果将函数声明为将会更好

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

正如来自莫斯科的@Vlad所说, 考虑到std::mapvalue_type是这样定义的:

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将转换为什么。

由于P0W为每个c++版本提供了完整的语法,我想通过查看您的代码来添加更多的点

  • 始终以const &作为参数,以避免同一对象的额外副本。
  • 使用unordered_map,因为它总是更快使用。看到这个讨论

下面是一个示例代码:

#include <iostream>
#include <unordered_map>
using namespace std;


void output(const auto& table)
{
for (auto const & [k, v] : table)
{
std::cout << "Key: " << k << " Value: " << v << std::endl;
}
}


int main() {
std::unordered_map<string, int> mydata = {
{"one", 1},
{"two", 2},
{"three", 3}
};
output(mydata);
return 0;
}

它甚至可以用经典的for循环完成。
手动推进迭代器

typedef std::map<int, int> Map;


Map mymap;


mymap['a']=50;
mymap['b']=100;
mymap['c']=150;
mymap['d']=200;


bool itexist = false;
int sizeMap = static_cast<int>(mymap.size());
auto it = mymap.begin();
for(int i = 0; i < sizeMap; i++){
std::cout << "Key: " << it->first << " Value: " << it->second << std::endl;
it++;
}

如果你只是想迭代内容而不改变值 做的事:< / p >

for(const auto & variable_name : container_name(//here it is map name)){
cout << variable_name.first << " : " << variable_name.second << endl;
}

如果你想修改映射的内容,删除const并保留&(如果你想直接修改容器内的内容)。如果你想使用容器值的复制,也要删除&符号;之后,你可以在“variable_name”上使用.first.second来访问它们。

其他方式:

map <int, string> myMap = {
{ 1,"Hello" },
{ 2,"stackOverflow" }
};
for (auto iter = cbegin(myMap); iter != cend(myMap); ++iter) {
cout << iter->second << endl;
}