【问题标题】:Merge two maps <string,int>合并两个地图 <string,int>
【发布时间】:2014-12-01 02:35:48
【问题描述】:

假设我有两张地图

std::map<string,int> mapA;

mapA["cat"] = 1;
mapA["dog"] = 3;

那么另一张地图是mapB

std::map<string,int> mapB;

mapB["cat"] = 1;
mapB["horse"] = 3;

现在我需要将 mapB 合并到 mapA 所以合并后最终的mapA是这样的

mapA["cat"] = 2;
mapA["dog"] = 3;
mapA["horse"] = 3;

我想知道实现这一目标的最佳方法是什么? 我知道我可以遍历 MapB 并检查每个元素是否在 MapA 中,如果是则增加值,否则将其添加到 MapA。我的问题是是否有算法或更快更有效的方法?

【问题讨论】:

  • 一种可能比直接方法更有效的算法可以尝试利用两个映射使用相同顺序的事实。不幸的是,接受提示的map::insert 不会返回是否可以找到该元素(如果找到了,您可以尝试使用前一个目标元素作为下一个目标元素的提示)。
  • 最佳情况草图O(N+M) 算法:coliru.stacked-crooked.com/a/0932b4743edf9824 不过,我可能对提示/插入位置感到困惑。

标签: c++ map


【解决方案1】:
template <class M>
void add_maps(M const& source, M& dest)
{
    for (auto const& entry : source)
        dest[entry.first] += entry.second;
}

【讨论】:

  • 由于参数没有被同等对待,我宁愿选择反映这一点的名称。
  • @dyp 同意。你建议什么名字?
  • 如果有地图,auto 会在这里做什么?
  • @MistyD std::map&lt;K, V&gt;::value_type,或者换句话说,std::pair&lt;K, V&gt;
  • 我可能会调用函数 addsum 或相关的东西,表明它正在添加元素(如果它们存在于两个地图中)。根据 OP 的要求,一个 map 没有更改,另一个在原地更改。所以一个可以称为source,另一个可以称为dest,如果实际执行了+=(操作是:将source的元素添加到dest的元素中)。
猜你喜欢
  • 2012-02-06
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多