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的实现?
答案 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);