将多个地图中的相同关键项汇总在一起?

use*_*112 -1 c++ c++11

我知道之前有人问过这个问题:

stl :: multimap - 如何获取数据组?

但答案是:

pair<Iter, Iter> range = my_multimap.equal_range("Group1");
int total = accumulate(range.first, range.second, 0);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我不会为我编译:

pair<multimap<int32_t, float>::iterator, multimap<int32_t, float>::iterator> range = multimap.equal_range(an_int);
float total = accumulate(range.first, range.second, 0);
Run Code Online (Sandbox Code Playgroud)

这是在GCC 4.8上

任何人都可以确认他们是否可以编译这个/提供正确的答案?

Bri*_*ian 5

这段代码有四个问题:

  1. 你有太多的关闭尖括号.
  2. 您的多图可能不应该被命名multimap.(虽然这可能不会导致编译错误,但很明显你不应该这样做.)
  3. 取消引用多图迭代器会给出一个键值,而不仅仅是值.所以当然你不能std::accumulate直接总结这些.
  4. 即使你使用multiset而不是multimap执行此操作,因此#3也不适用,0因为初始值将导致所有浮点数被截断,因为它会推断int累加器的类型...所以你可能会得到错误的答案.

看起来你在2003年陷入困境,因为你实际写出了返回类型equal_range,所以我猜你没有lambdas或range-for-loops.

pair<multimap<int32_t, float>::iterator,
     multimap<int32_t, float>::iterator> range = M.equal_range(an_int);
float total = 0;
for (multimap<int32_t, float>::iterator I = range.first; I != range.second; ++I) {
    total += I->second;
}
Run Code Online (Sandbox Code Playgroud)

或者equal_range完全避免和那个讨厌的声明......

float total = 0;
for (multimap<int32_t, float>::iterator I = M.lower_bound(an_int);
     I != M.end() && I->first == an_int;
     ++I) {
    total += I->second;
}
Run Code Online (Sandbox Code Playgroud)

编辑:好的,所以你有C++ 11的支持.所以你可以这样做:

auto range = M.equal_range(an_int);
float total = accumulate(range.first, range.second, 0.0,
                         [](float x, pair<int32_t, float> y) { return x + y.second; });
Run Code Online (Sandbox Code Playgroud)

(注:如果你有C++ 14的支持,你甚至可以代替pair<int32_t, float>通过auto在lambda).