【问题标题】:How to collect the same type of Map's value如何采集同类型 Map 的值
【发布时间】:2010-12-01 20:46:22
【问题描述】:

我们有一个键和值都是 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 算法。

【问题讨论】:

    标签: c++ stl map


    【解决方案1】:

    在我看来,你做错了,你可能想要一个多图。

    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);
    

    【讨论】:

    • 是的,看起来 OP 正在尝试使用 key 作为 value 和 value 作为 key。
    • 在一种情况下需要这个,否则它是一个我们正在处理密钥本身的地图。
    • 那就看看 boost::bimap。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      假设你真的有很多,那就是boost multi_index,虽然它只是成对的整数,维护两张地图可能没有更多的工作,后者是multimap&lt; int, int &gt;或@987654323 @ 会起作用的

      【讨论】:

        【解决方案4】:

        如果可以更改所有要求,即可以交换键-值,则可以使用map&lt;int, vector&lt;int&gt; &gt; 并通过将数据推送到与键对应的向量中来构建映射。这样就可以在构建地图时对其进行优化。

        如果不能像 OP 在其中一个 cmets 中所说的那样更改要求,那么我认为优化的空间不大。

        【讨论】:

          猜你喜欢
          • 2020-05-14
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 2016-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多