我有两个 std::map<int,int> map ,并希望将它们合并到第三个 map 中,如下所示:
如果在两个映射中找到相同的键,则在第三个映射中创建一个具有相同键和值的对,该值是来自第一个和第二个映射的值的总和,否则只需将一对复制到第三个映射。
我怀疑它可以用 std::accumulate 来完成,但我不太了解它。

最佳答案

std::set_union 启发的过于通用的解决方案。与第一个建议的答案不同,这应该在 O(n) 而不是 O(n log n) 中运行。

编辑 :由于插入到最终 map 中,它仍然是 O(n log n)。

#include <map>
#include <iostream>
#include <iterator>
#include <algorithm>

template<class InputIterT1, class InputIterT2, class OutputIterT, class Comparator, class Func>
OutputIterT merge_apply(
    InputIterT1 first1, InputIterT1 last1,
    InputIterT2 first2, InputIterT2 last2,
    OutputIterT result, Comparator comp, Func func) {
  while (true)
  {
    if (first1 == last1) return std::copy(first2, last2, result);
    if (first2 == last2) return std::copy(first1, last1, result);

    if (comp(*first1, *first2) < 0) {
      *result = *first1;
      ++first1;
    } else if (comp(*first1, *first2) > 0) {
      *result = *first2;
      ++first2;
    } else {
      *result = func(*first1, *first2);
      ++first1;
      ++first2;
    }
    ++result;
  }
}

template<class T>
int compare_first(T a, T b) {
  return a.first - b.first;
}

template<class T>
T sum_pairs(T a, T b) {
  return std::make_pair(a.first, a.second + b.second);
}

using namespace std;
int main(int argc, char **argv) {
  map<int,int> a,b,c;

  a[1] = 10;
  a[2] = 11;

  b[2] = 100;
  b[3] = 101;

  merge_apply(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()),
      compare_first<pair<int, int> >, sum_pairs<pair<int, int> >);

  for (auto item : c)
    cout << item.first << " " << item.second << endl;
}

关于c++ - 合并两个映射,对 C++ 中相同键的值求和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20771786/

10-14 06:27