818 Stimmen

Wie findet man heraus, ob ein Element in einem std::vector vorhanden ist?

Ich möchte lediglich prüfen, ob ein Element im Vektor vorhanden ist oder nicht, damit ich jeden Fall behandeln kann.

if ( item_present )
   do_this();
else
   do_that();

1209voto

MSN Punkte 51308

Sie können verwenden std::find de <algorithm> :

#include <algorithm>
#include <vector>
vector<int> vec; 
//can have other data types instead of int but must same datatype as item 
std::find(vec.begin(), vec.end(), item) != vec.end()

Dies gibt einen Iterator zum ersten gefundenen Element zurück. Ist dies nicht der Fall, wird ein Iterator auf ein Element nach dem Ende zurückgegeben. Mit Ihrem Beispiel:

#include <algorithm>
#include <vector>

if ( std::find(vec.begin(), vec.end(), item) != vec.end() )
   do_this();
else
   do_that();

139voto

Brian Neal Punkte 30564

Wie andere bereits gesagt haben, verwenden Sie die STL find o find_if Funktionen. Wenn Sie jedoch in sehr großen Vektoren suchen und dies die Leistung beeinträchtigt, sollten Sie Ihren Vektor sortieren und dann die Funktion binary_search , lower_bound , oder upper_bound Algorithmen.

60voto

spiralmoon Punkte 2836

Wenn Ihr Vektor nicht geordnet ist, verwenden Sie den von MSN vorgeschlagenen Ansatz:

if(std::find(vector.begin(), vector.end(), item)!=vector.end()){
      // Found the item
}

Wenn Ihr Vektor geordnet ist, verwenden Sie binary_search Methode Brian Neal vorgeschlagen:

if(binary_search(vector.begin(), vector.end(), item)){
     // Found the item
}

Die binäre Suche führt im schlimmsten Fall zu einer Leistung von O(log n), was wesentlich effizienter ist als der erste Ansatz. Um die binäre Suche zu verwenden, können Sie qsort verwenden, um den Vektor zuerst zu sortieren, damit er geordnet ist.

53voto

m-sharp Punkte 15347

Verwenden Sie find aus dem Algorithmus-Header von stl. Ich habe seine Verwendung mit dem Typ int illustriert. Sie können jeden beliebigen Typ verwenden, solange Sie auf Gleichheit vergleichen können (überladen Sie ==, wenn Sie es für Ihre benutzerdefinierte Klasse benötigen).

#include <algorithm>
#include <vector>

using namespace std;
int main()
{   
    typedef vector<int> IntContainer;
    typedef IntContainer::iterator IntIterator;

    IntContainer vw;

    //...

    // find 5
    IntIterator i = find(vw.begin(), vw.end(), 5);

    if (i != vw.end()) {
        // found it
    } else {
        // doesn't exist
    }

    return 0;
}

29voto

Deqing Punkte 12880

In C++11 können Sie any_of . Wenn es sich zum Beispiel um eine vector<string> v; dann:

if (any_of(v.begin(), v.end(), bind(equal_to<string>(), _1, item)))
   do_this();
else
   do_that();

Alternativ können Sie auch ein Lambda verwenden:

if (any_of(v.begin(), v.end(), [&](const std::string& elem) { return elem == item; }))
   do_this();
else
   do_that();

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