Wird std :: remove_if immer das Prädikat für jedes Element in der Reihenfolge aufrufen (gemäß der Reihenfolge des Iterators) oder könnte es als nicht in Ordnung bezeichnet werden?Ist std :: remove_if garantiert Prädikat in Reihenfolge zu rufen?
ist hier ein Spielzeug Beispiel dafür, was Ich mag zu tun wäre:
void processVector(std::vector<int> values)
{
values.erase(std::remove_if(values.begin(), values.end(), [](int v)
{
if (v % 2 == 0)
{
std::cout << v << "\n";
return true;
}
return false;
}));
}
Ich brauche alle Elemente eines Vektors, die bestimmte Kriterien erfüllen, zu verarbeiten und zu entfernen und löschen + remove_if für das scheint perfekt. Die Verarbeitung, die ich ausführen werde, hat jedoch Nebenwirkungen, und ich muss sicherstellen, dass die Verarbeitung in der Reihenfolge erfolgt (im Beispiel angenommen, dass ich die Werte in der Reihenfolge drucken möchte, in der sie im ursprünglichen Vektor erscheinen).
Ist es sicher anzunehmen, dass mein Prädikat für jedes Element in Reihenfolge aufgerufen wird?
Ich nehme an, dass die Ausführungsrichtlinien von C++ 17 dies aufklären würden, aber da C++ 17 noch nicht raus ist, hilft das offensichtlich nicht.
Edit: Auch, ist das eine gute Idee? Oder gibt es einen besseren Weg, dies zu erreichen?
Um klar zu sein, würden die Nebenwirkungen den 'Vektor' selbst verändern? Das würde die Iteratoren in jedem Fall ungültig machen, also ist es gut, das zuerst zu überprüfen. Ich würde auch auf irgendwelche Nebenwirkungen achten, die die _values_ in dem 'vector' beeinflussen könnten, da während der Ausführung von' remove_if' die genaue Position irgendeines gegebenen Gegenstandes in dem 'vector' nicht garantiert ist. – ShadowRanger
Nein, die Nebenwirkungen würden den Vektor nicht verändern. Die Nebenwirkungen schreiben tatsächlich einige Dinge in eine Datei. – Solaraeus
Ich denke Wetter oder nicht, es ist strittig. Tun Sie alle Nebenwirkungen, dann machen Sie die Entfernung. –