获取C++中形式为 <pair<int,int>, int*> 的映射的所有键

Getting all the keys of a map of the form <pair<int,int>, int*> in C++

本文关键字:int lt gt 映射 pair C++ 获取      更新时间:2023-10-16

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

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

问题是我无法弄清楚我如何获得该表格的所有键

pair<int,int>

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

如果您想通过所有键迭代:

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 Transfort Iterator从地图包装迭代器,从而使包裹的迭代器被删除时,它只会为您提供地图的键。然后,您可以直接在一系列转换迭代器上调用std::vector::insertstd::set::insert