40 Stimmen

Unterbrechung in std::for_each-Schleife

Wie kann ich bei der Verwendung des std::for_each-Algorithmus unterbrechen, wenn eine bestimmte Bedingung erfüllt ist?

3voto

Dave Van den Eynde Punkte 16711

Das geht nicht, es sei denn, man löst eine Ausnahme aus, was keine gute Idee ist, weil man mit Ausnahmen keine Flusskontrolle durchführen kann.

Update: offenbar hat Boost eine for_each_if, die puede helfen, aber Sie verwenden Boost nicht.

1voto

Charlie Martin Punkte 106684

Sie lösen eine Ausnahme aus. Ob das eine gute Idee ist oder nicht, ist eine Art Stilfrage, @Dan, kann aber eher ein Problem mit deinem Design sein. for_each ist für eine Art funktionalen Programmierstil gedacht, der implizit davon ausgeht, dass deine Funktion gleichmäßig auf die Menge angewendet werden kann. Wenn Sie also tun zu brechen, könnte dies als ungewöhnlicher Zustand angesehen werden, der eine Ausnahme rechtfertigt.

Die andere und "funktionalere" Lösung besteht darin, die Funktion so zu schreiben, dass sie keine Auswirkungen auf bestimmte Anwendungen hat, wenn sie keine Auswirkungen haben soll. Wenn Sie also zum Beispiel eine Summierfunktion haben, addieren Sie in den Fällen, in denen sie "kaputt" ist, 0.

0voto

Sie können verwenden std::find_if stattdessen std::for_each :

int aaa[]{ 1, 2, 3, 4, 5, 6, 7, 8 };
std::find_if(aaa, std::next(aaa, sizeof(aaa) / sizeof(int)), [](const auto &i) {
    if (i == 5)
        return true;
    std::cout << i << std::endl;
    return false;
});

Ausgabe:
1
2
3
4

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X