【问题标题】:Convert a multi_key map into a "normal" map joining the multiple keys将 multi_key 映射转换为连接多个键的“普通”映射
【发布时间】:2011-11-01 08:36:09
【问题描述】:

我正在寻找一种将多键映射“压缩”到法线映射的方法。我的多图如下所示:

Key                 v a l u e s 
<string>            <string>

140,1,08,2500       1456 
140,1,10,3040       1456 
.............       ....
.............       ....
140,1,08,2500       8g   
140,1,13,3040       8g   
.............       ....

第一个和倒数第二个键是相同的。我的目标是合并这两行(以及所有其他重复的密钥对),以便结果是:

140,1,08,2500       14568g

属于被合并的原始两个键的值。现在,我可以编写一些不错的循环并迭代、复制和删除内容等等,但我想知道是否有人知道一种聪明的,甚至可能是快速的方法来完成这项工作。

【问题讨论】:

    标签: c++ maps duplicates


    【解决方案1】:

    保持简单...

    map<string, string> new_map;
    
    for(auto it = mmap.begin(), end = mmap.end(); it != end; ++it)
    {
      new_map[it->first].append(it->second);
    }
    

    为什么要让它更复杂?

    【讨论】:

      【解决方案2】:

      如果多重映射中的元素以正确的顺序存储(即您知道1456 总是在8g 之前迭代,那么您可以做一个简单的循环:

      std::map< key_t, string > result;
      for ( multimap_t::const_iterator it = mm.begin(); it != mm.end(); ++it ) {
         result[ it->first ].append( it->second );
      }
      

      问题是我不认为共享一个公共键的元素的顺序是有保证的。

      【讨论】:

      • AFAIK,对于同一个键,它维护插入顺序,尽管这可以由实现定义。
      • @Nim:问题是标准不保证这一点。
      • 是的,即使在新标准中我也看不到任何提及,这就是为什么我说,它最有可能定义了实现,由 OP 来确定是否有任何其他自然顺序应用...
      猜你喜欢
      • 2022-10-02
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多