我想在地图的前3个元素的std::accumulate
上使用map<int,int>
。这不起作用,你能指出我的错误吗?
int main(){
map<int, int> m;
m[1] = 1;
m[2] = 2;
m[3] = 4;
m[4] = 8;
struct pair_add {
int operator()(int i, const std::pair<int, int>& x) {
return i + x.second;
}
};
int cumSumQty = accumulate(m.begin(), m.end, 0, pair_add()); //THIS COMPILE
int cumSumQty = accumulate(m.begin(), m.begin()+3, 0, pair_add()); //THIS DOES NOT
}
答案 0 :(得分:4)
std::map
迭代器不是随机访问,所以这个
m.begin() + 3
是非法的。您可以改为使用std::next
:
std::next(m.begin(), 3);
用法:
int cumSumQty = accumulate(m.begin(), std::next(m.begin(), 3), 0, pair_add());
答案 1 :(得分:3)
Map没有随机访问迭代器,你不能使用+
。
将std::advance
用作:
auto it = m.begin();
std::advance(it,3);
int cumSumQty = accumulate(m.begin(), it , 0, pair_add());
或者,最好使用std::next
:
int cumSumQty = accumulate(m.begin(), std::next(m.begin(), 3) , 0, pair_add());
由于std::map::iterator
是BidirectionalIterator
,所以你甚至可以这样做:
int cumSumQty = accumulate(std::next(m.end(),-3), m.end(), 0, pair_add());
希望有所帮助。
答案 2 :(得分:1)
使用std :: advance。 std :: map的迭代器不是随机访问迭代器,因此添加偏移量不起作用。但是,我也考虑编写一个简单的for循环,或者甚至可以拼写出三个元素。