我有两个 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/