获取格式<pair <int,int>,int *&gt;格式的地图的所有键在C ++中</pair <int,int>

时间:2014-03-08 06:47:22

标签: c++ map

在我的C ++代码中,我使用的是这样的地图:

std::map<std::pair<int,int>,int*> patterns;

问题在于我无法弄清楚如何获得该地图的所有关键字

pair<int,int>

我已经看到了一些与之相关的问题,但在所有情况下,键都是单个整数。

1 个答案:

答案 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::insertstd::set::insert