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;
}
War es hilfreich?

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:

boost :: Algorithmus :: find_all

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
scroll top