我知道之前有人问过这个问题:
但答案是:
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上
任何人都可以确认他们是否可以编译这个/提供正确的答案?
这段代码有四个问题:
multimap.(虽然这可能不会导致编译错误,但很明显你不应该这样做.)std::accumulate直接总结这些.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).