std :: accumulate BinaryOperator的副作用

时间:2016-07-28 18:11:49

标签: c++ c++11

cppreference.com上的

std::accumulate文档指出:

  

op不能使任何迭代器无效,包括结束迭代器,或者   修改所涉及范围的任何元素(自c ++ 11起)

稍后,我在此处报告了一个可能的实现:

template<class InputIt, class T, class BinaryOperation>
T accumulate(InputIt first, InputIt last, T init, 
             BinaryOperation op)
{
    for (; first != last; ++first) {
        init = op(init, *first);
    }
    return init;
}

op如何能够使一些迭代器无效&#34;或者&#34;修改范围&#34;的元素,假设这是std :: accumulate的实现?

1 个答案:

答案 0 :(得分:4)

您可以定义一个lambda来修改范围中的元素和/或修改范围本身。例如,使用以下lambda将违反std::accumulate的先决条件:

std::vector<int> v{0,1,2,3,4};
auto illegal_op = [&v](int init, int val) { 
    v.back() *= 2;      // modifying elements in the range
    v.push_back(42);    // invalidating iterators in the range
    return init + val;
};
std::accumulate(v.begin(), v.end(), 0, illegal_op);