遍历二维 std::unordered_map
Iterating through a two dimensional std::unordered_map
我定义了一个二维地图如下:
unordered_map< string, unordered_map<string, Road*>* > matrix;
哪里的路简直了:
class Road {
public:
Road() : connected(0), weight(0) {}
bool connected;
int weight;
};
我试过以这种方式遍历地图,但编译失败。
for (auto &i : matrix) {
for (unordered_map< string, unordered_map<string, Road*>* >::iterator iter1 = i.second->begin();
iter1 != i.second->end(); iter1++) {
}
}
因为我知道我的矩阵总是 NxN,我能做的一件事是
for (auto &i : matrix) {
for (auto &j : matrix) {
}
}
但我想知道是否有更简洁的不同大小的方法。
迭代映射和无序映射产生 key/value 对。当你这样做时
for (const auto& p : matrix)
...
变量 p
的类型为 const std::pair<std::string, std::unordered_map<std::string, Road*>*>&
。因此,要迭代内部映射,请执行:
for (const auto& p : matrix)
for (const auto& q : *p.second) {
Road *r = q.second;
...
}
可以用p.first
获取外键,q.first
获取内键
容器的大小无关紧要。 range-for 循环(正确使用时)适用于任何大小的容器,即使在您的嵌套情况下也是如此。
我定义了一个二维地图如下:
unordered_map< string, unordered_map<string, Road*>* > matrix;
哪里的路简直了:
class Road {
public:
Road() : connected(0), weight(0) {}
bool connected;
int weight;
};
我试过以这种方式遍历地图,但编译失败。
for (auto &i : matrix) {
for (unordered_map< string, unordered_map<string, Road*>* >::iterator iter1 = i.second->begin();
iter1 != i.second->end(); iter1++) {
}
}
因为我知道我的矩阵总是 NxN,我能做的一件事是
for (auto &i : matrix) {
for (auto &j : matrix) {
}
}
但我想知道是否有更简洁的不同大小的方法。
迭代映射和无序映射产生 key/value 对。当你这样做时
for (const auto& p : matrix)
...
变量 p
的类型为 const std::pair<std::string, std::unordered_map<std::string, Road*>*>&
。因此,要迭代内部映射,请执行:
for (const auto& p : matrix)
for (const auto& q : *p.second) {
Road *r = q.second;
...
}
可以用p.first
获取外键,q.first
获取内键
容器的大小无关紧要。 range-for 循环(正确使用时)适用于任何大小的容器,即使在您的嵌套情况下也是如此。