Anzahl der Treffer von find_if
-
Quaneu schrieb:
Bzw. suche ich selber und benutze nicht find_if und count_if, dann habe ich nur einen Schleifendurchlauf.
Bei n Treffern wird du wohl n Schleifendurchläufe haben.
-
Wenn du die Treffer selbst benötigst, dann kannst du auch remove_if, remove_copy_if mit negierter Bedingung benutzen oder aber gleich copy_if, s. <algorithm>.
-
Ich meinte ich muss nur mit einer Schleife einmal über den vector laufen und nicht zweimal ;).
-
Willst du jetzt nur auf dem ersten Treffer etwas ausführen, dann reicht find_if, ansonsten kannst du auch einfach so etwas wie for_each_if benutzen:
template<typename Iterator, typename Pred, typename Operation> void for_each_if(Iterator begin, Iterator end, Pred p, Operation op) { for(; begin != end; begin++) if (p(*begin)) op(*begin); }
Wofür benötigst du dann die Anzahl der Treffer?
-
Wenn es nur einen Treffer gibt, dann will ich auf diesem "arbeiten", gibt es keinen oder mehr als einen, dann soll nichts gemacht werden.
Das mit copy_if kommt der Sache schon sehr nahe, wobei ich immer mehr zu einer eigenen Lösung tendiere.
-
In etwa so? (iter ist letztes Element noch zu behandeln!)
std::vecto<X> v ... auto iter = std::find_if( begin(v), end(v), ...); if( iter != end(v) && std::find_if( iter+1, ...) == end(v) ) { doit } else { nix machen
-
Vielen Dank für deine Lösung. Diese gefällt mir sehr gut, da sie nicht viel langsamer sein sollte als eine eigene und man benutzt Existierendes
-
Wie wäre es denn mit:
auto first = std::find_if( begin(v), end(v), ...); if( first == std::find_if( rbegin(v), rend(v), ...) ) { doit } else { nix machen
?
-
Also bei mir kompiliert es leider nicht. "==" ist das Problem. Sonst würde ich sagen, sieht es noch ein bisschen besser aus
-
Ungetestet:
first == std::find_if( rbegin(v), rend(v), ...).base()
-
So gehts. Vielen Dank für eure Hilfe.