如何收集相同类型的Map的值

时间:2010-12-01 10:56:44

标签: c++ stl map

我们有一个映射,其中键和值都是int类型。我们必须在地图中搜索特定值并在一个向量中收集这些键。 代码快照就像

map<int,int>m;
map<int,int>::iterator itr;
vector<int> v;
m.insert(make_pair<int,int>(1,2));
m.insert(make_pair<int,int>(2,2));
m.insert(make_pair<int,int>(3,2));
m.insert(make_pair<int,int>(4,4));
m.insert(make_pair<int,int>(5,5));

目前的代码如下:

for ( itr = m.begin(); itr != m.end(); ++itr )
{
    if ((*itr).second == 2 )
    v.push_back((*itr).first )
}

我们想优化它。我们如何处理STL算法。

4 个答案:

答案 0 :(得分:3)

在我看来,你这样做是错误的,你可能想要一个多图。

std::multimap<int,int> m;
std::vector<int> v;
m.insert(std::make_pair<int,int>(2,1));
m.insert(std::make_pair<int,int>(2,2));
m.insert(std::make_pair<int,int>(2,3));
m.insert(std::make_pair<int,int>(4,4));
m.insert(std::make_pair<int,int>(5,5));

typedef std::multimap<int,int>::iterator iterator;
std::pair<iterator, iterator> bounds = m.equal_range(2);
for(iterator it = bounds.first; it != bounds.second; ++it)
   v.push_back(it->second);

答案 1 :(得分:0)

您可以将键与值交换(=所有值都是不同的)吗?如果是这样,那么您可以使用map.find()(即O(log n))来搜索项目。如果不是你写的代码是正确的方法。

另一种方法是在地图填充值时创建向量,但这假设在插入时已知过滤条件。

答案 2 :(得分:0)

假设你确实拥有很多,有boost multi_index,虽然它只是成对的一组,但维护两张地图可能不再需要工作,后者是multimap< int, int > ,或map< int, set< int > >将起作用

答案 3 :(得分:0)

如果可以改变任何要求,即可以交换键值,可以使用map<int, vector<int> >并通过将数据推入对应于该键的向量来构建映射。这样就可以在构建地图时对其进行优化。

如果要求不能像OP在其中一条评论中所说的那样改变,那么我认为优化的余地不大。