2011-01-05 17 views
31

Gibt es eine find() Funktion für die Liste, wie es in Vektor war?Wie suche ich nach einem Element in einer STL-Liste?

Gibt es eine Möglichkeit, das in der Liste zu tun?

+2

'std: : vector 'hat eine' find() 'Methode? Das ist neu für mich. –

+0

mybad ... ich meine fint (vektoriterator.begin(), vektoriterator.end(), string) –

+2

Sie haben Recht, 'std :: vector' hat keine' find() 'Methode. – Raedwald

Antwort

80

Sie verwenden std::find von <algorithm>, die für std::list und std::vector gleich gut funktioniert. std::vector hat keine eigene Such-/Suchfunktion.

#include <list> 
#include <algorithm> 

int main() 
{ 
    std::list<int> ilist; 
    ilist.push_back(1); 
    ilist.push_back(2); 
    ilist.push_back(3); 

    std::list<int>::iterator findIter = std::find(ilist.begin(), ilist.end(), 1); 
} 

Beachten Sie, dass dies für als auch Standard-Bibliothekstypen wie std::string standardmäßig wie int eingebauten Typen arbeitet, weil sie operator== für sie zur Verfügung gestellt. Wenn Sie mit std::find auf einen Behälter eines benutzerdefinierten Typs verwenden, sollten Sie operator== Überlastung std::find zu ermöglichen, richtig zu arbeiten: EqualityComparable concept

+0

Was ist die zeitliche Komplexität von 'std :: find()'? Vielleicht, O (n)? –

+2

Keine binären Suchfunktionen für einen sortierten Container? Lazy Implementierung. – LDS

+3

@LDS - 'std :: binary_search' bietet binäre Suchen. – birryree

16

Nein, nicht direkt in der std :: list Vorlage selbst. Sie können jedoch den std :: find-Algorithmus wie folgt verwenden:

3

Was Sie tun können und was Sie tun sollten, sind verschiedene Angelegenheiten.

Wenn die Liste sehr kurz ist, oder Sie nur einmal finden, dann verwenden Sie den linearen Ansatz oben.

Allerdings ist die lineare Suche eines der größten Übel, das ich im langsamen Code finde, und erwäge die Verwendung einer geordneten Sammlung (set oder multiset, wenn du Duplikate erlaubst). Wenn Sie eine Liste aus anderen Gründen führen müssen, z. B. indem Sie eine LRU-Technik verwenden oder den Anzeigenauftrag oder eine andere Reihenfolge beibehalten möchten, erstellen Sie einen Index dafür. Sie können das mit einem std :: set der Listeniteratoren (oder multiset) tun, obwohl Sie dies jedes Mal beibehalten müssen, wenn Ihre Liste geändert wird.

6

Neben std :: find (von Algorithmus), können Sie auch std::find_if verwenden (die dann std IMO besser ist :: finden) oder andere Fund Algorithmus von this list


#include <list> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::list<int> myList{ 5, 19, 34, 3, 33 }; 


    auto it = std::find_if(std::begin(myList), 
          std::end(myList), 
          [&](const int v){ return 0 == (v % 17); }); 

    if (myList.end() == it) 
    { 
     std::cout << "item not found" << std::endl; 
    } 
    else 
    { 
     const int pos = std::distance(myList.begin(), it) + 1; 
     std::cout << "item divisible by 17 found at position " << pos << std::endl; 
    } 
} 
+0

Warum ist find_if besser? Wenn Sie nach einem Element suchen, das mit der Gleichheit übereinstimmt, sagen Sie, dass Sie nicht find verwenden und stattdessen find_if verwenden würden? find_if erlaubt Ihnen benutzerdefinierte Suche, aber wenn Sie in einige schreckliche Funktor passen mussten, um nach Gleichen zu suchen, würde es Code sehr hässlich im Vergleich zur Verwendung von finden. – CashCow

+1

@CashCow Es hängt alles davon ab, welche Art von Element in dem Vektor oder der Liste ist. Manchmal ist es nicht möglich, std :: find zu verwenden. –

+0

Ja, manchmal brauchen Sie find_if, weshalb es Teil der Bibliothek ist, aber das macht es nicht "besser", so dass Sie es verwenden würden, selbst wenn std :: find funktioniert. – CashCow

Verwandte Themen