【问题标题】:how to loop multimap only to get first key-value pairs for every key?如何循环多映射只为每个键获取第一个键值对?
【发布时间】:2013-03-07 19:49:09
【问题描述】:

例如,如果我有这样的 mmap:

alice -> 30
bob -> 23
josh -> 20
josh -> 30
andy -> 40
andy -> 40

只得到这对:

alice -> 30
bob -> 23
josh -> 20
andy -> 40

【问题讨论】:

  • 您是否需要为每个密钥设置一对(基本上是随机选择的),还是实际上需要一对(根据什么指标)?
  • @Grizzly:好吧,更简单的是,我真的不需要当场的价值。我以后可以获取我想要的值。
  • @Shafik 在我看来不像是重复的。这个问题想要为每个唯一键找到“第一个”(无论是什么意思)value,而您链接到的那个想要自己识别唯一键(不关心值,或者哪个是“第一”)。
  • @DrewDormann:实际上是的,从它的工作原理来看(因为我不知道问这个问题)我可以得到我想要的任何值,首先,最后一个中间。

标签: c++ iteration multimap


【解决方案1】:

这应该尽可能干净、有效:

for(auto it = m.begin(); it != m.end(); it = m.upper_bound(it->first)) {
  std::cout << it->first << ":" << it->second << std::endl;
}

【讨论】:

【解决方案2】:

这是一个简短的答案,但不是最有效的

multimap<string, int> mm;
// Add stuff to multimap

// Map with only the first items from multimap
map<string,int> m;

for(auto iter = mm.rbegin(); iter != mm.rend(); ++iter){
   m[iter->first] = iter->second;
}

这是有效的,因为我们从头开始。因此,multimap 中的任何重复键都将覆盖 map 中的前一个键。既然我们从头开始,我们应该有第一个关键

【讨论】:

    【解决方案3】:

    也许你需要这个,我用lower_bound 得到了一个项目:

    #include <iostream>
    #include <map>
    #include <string>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        multimap<string, int> m;
    
        m.insert(make_pair("alice", 30));
        m.insert(make_pair("bob", 23));
        m.insert(make_pair("josh", 30));
        m.insert(make_pair("josh", 20));
        m.insert(make_pair("andy", 40));
        m.insert(make_pair("andy", 40));
    
        set<string> names;
    
        for (multimap<string, int>::const_iterator i = m.begin(); i != m.end(); i++)
            names.insert(i->first);
    
        for (set<string>::const_iterator i = names.begin(); i != names.end(); i++)
        {
            multimap<string, int>::const_iterator j = m.lower_bound(*i);
            cout << j->first << " -> " << j->second << endl;
        }
    }
    

    输出:

    爱丽丝 -> 30

    安迪 -> 40

    鲍勃-> 23

    乔什 -> 30

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2015-08-12
      • 2022-06-19
      • 2021-08-11
      相关资源
      最近更新 更多