Alternative Version von find_if die alle findet, nicht nur die erste?
Frage
Gibt es eine alternative Version von std::find_if
dass gibt einen Iterator über alle gefundenen Elemente, statt nur die ersten?
Beispiel:
bool IsOdd (int i) {
return ((i % 2) == 1);
}
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
std::vector<int>::iterator it = find_if(v.begin(), v.end(), IsOdd);
for(; it != v.end(); ++it) {
std::cout << "odd: " << *it << std::endl;
}
Lösung
Sie können nur eine for
Schleife verwenden:
for (std::vector<int>:iterator it = std::find_if(v.begin(), v.end(), IsOdd);
it != v.end();
it = std::find_if(++it, v.end(), IsOdd))
{
// ...
}
Alternativ können Sie Ihren Zustand und Aktion in eine Funktors setzen (Durchführung der Maßnahme nur dann, wenn die Bedingung wahr ist) und nur Verwendung std::foreach
.
Andere Tipps
in STL gibt es nicht, aber boost bietet diese funcionality:
Versuchen Sie zunächst immer mit typischer STL Nutzung selbst zu kommen, können Sie für Schub und gehen können. Hier wird mehr vereinfachter Form aus dem oben genannten Antwort von Charles.
vec_loc = find_if(v3.begin(), v3.end(), isOdd);
if (vec_loc != v3.end())
{
cout << "odd elem. found at " << (vec_loc - v3.begin()) << "and elem found is " << *vec_loc << endl;
++vec_loc;
}
for (;vec_loc != v3.end();vec_loc++)
{
vec_loc = find_if(vec_loc, v3.end(), isOdd);
if (vec_loc == v3.end())
break;
cout << "odd elem. found at " << (vec_loc - v3.begin()) << "and elem found is " << *vec_loc << endl;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow