如何在map的前3个值上使用std :: accumulate

时间:2013-07-02 09:34:23

标签: c++ map stl iterator

我想在地图的前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
}

3 个答案:

答案 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::iteratorBidirectionalIterator,所以你甚至可以这样做:

int cumSumQty = accumulate(std::next(m.end(),-3), m.end(), 0, pair_add());

希望有所帮助。

答案 2 :(得分:1)

使用std :: advance。 std :: map的迭代器不是随机访问迭代器,因此添加偏移量不起作用。但是,我也考虑编写一个简单的for循环,或者甚至可以拼写出三个元素。