在我的C ++代码中,我使用的是这样的地图:
std::map<std::pair<int,int>,int*> patterns;
问题在于我无法弄清楚如何获得该地图的所有关键字
pair<int,int>
我已经看到了一些与之相关的问题,但在所有情况下,键都是单个整数。
答案 0 :(得分:1)
如果您想迭代所有键:
<强> C ++ 03 强>
for (std::map<std::pair<int,int>,int*>::iterator I = patterns.begin(); I != patterns.end(); I++) {
// I->first is a const reference to a std::pair<int,int> stored in the map
}
<强> C ++ 11 强>
for (auto& kv : patterns) {
// kv.first is a const reference to a std::pair<int,int> stored in the map
}
如果您想将密钥复制到新容器中:
<强> C ++ 03 强>
std::vector<std::pair<int,int> > V;
std::set<std::pair<int,int> > S;
for (std::map<std::pair<int,int>,int*>::iterator I = patterns.begin(); I != patterns.end(); I++) {
V.push_back(I->first);
S.insert(I->first);
}
<强> C ++ 11 强>
std::vector<std::pair<int,int>> V;
std::set<std::pair<int,int>> S;
for (auto& kv : patterns) {
V.push_back(kv.first);
S.insert(kv.first);
}
因为我很无聊,这里有一些额外的解决方案:
您也可以使用标准算法和lambda函数来完成它,但我认为这不仅仅比自己编写循环更好:
std::vector<std::pair<int,int>> V(patterns.size());
std::transform(patterns.begin(), patterns.end(), V.begin(),
[](decltype(patterns)::value_type& p){ return p.first; });
std::set<std::pair<int,int>> S;
std::for_each(patterns.begin(), patterns.end(),
[&S](decltype(patterns)::value_type& p){ S.insert(p.first); });
您还可以使用Boost变换迭代器从地图中包装迭代器,这样当解包的迭代器被解除引用时,它只会为您提供地图中的键。然后,您可以直接在一系列转换迭代器上调用std::vector::insert
或std::set::insert
。