2016-07-28 5 views
2
std::accumulate

документация на cppreference.com гласит:СТД :: накапливает BinaryOperator побочных эффектов

оп не должен привести к недействительности итераторов, в том числе конечных итераторов, или изменять любые элементы диапазона вовлеченного (так как с + +11)

Позже показана реализация possibile, что я сообщаю здесь:

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 может «аннулировать некоторые итераторы» или «изменять элементы диапазона», предполагая эту реализацию std :: accumulate?

+6

' [& VEC] (Int А, Int б) {vec.clear(); return a + b; } '? – LogicStuff

ответ

4

Вы можете определить лямбду, которая изменяет элементы в диапазоне и/или изменяет сам диапазон. Например, с помощью следующего лямбда будет нарушением предпосылок std::accumulate «s:

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); 
Смежные вопросы