2016-07-28 16 views
2

std::accumulate Dokumentation auf cppreference.com lautet:std :: akkumuliert BinaryOperator Nebenwirkungen

op irgendwelche Iteratoren nicht ungültig ist, einschließlich der Stirn Iteratoren oder alle Elemente des beteiligten Bereichs ändern (da + c +11)

Später wird es eine possibile Implementierung gezeigt, dass ich hier melden:

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; 
} 

Wie könnte op "einige Iteratoren ungültig machen" oder "Elemente des Bereichs modifizieren", vorausgesetzt, diese Implementierung von std :: accumulate?

+6

' [& vec] (int a, int b) {vec.clear(); Rückgabe a + b; } '? – LogicStuff

Antwort

4

Sie könnten einen Lambda definieren, der die Elemente im Bereich ändert und/oder den Bereich selbst ändert. Zum Beispiel würde das folgende Lambda verwendet werden, um eine Verletzung der std::accumulate ‚s Voraussetzungen:

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); 
Verwandte Themen