2010-08-10 30 views
175

Mögliche Duplizieren:
How to find an item in a std::vector?überprüfen, ob ein std :: vector ein bestimmtes Objekt enthält?

Gibt es etwas in <algorithm>, die Sie, wenn ein std :: Behälter etwas enthält überprüfen können? Oder eine Art und Weise zu machen, zum Beispiel:

if(a.x == b.x && a.y == b.y) 
return true; 

return false; 

kann dies nur mit std::map erfolgen, da es Schlüsseln verwendet?

Dank

+6

std :: finden ...... – sje397

+0

Wenn es etwas bestimmtes enthält, oder nur davon ist nicht leer? –

+2

Welche C++ Referenz verwenden Sie? Und der Header heißt '' - no no .h. –

Antwort

355

prüft v das Element enthält x:

#include <algorithm> 

if(std::find(v.begin(), v.end(), x) != v.end()) { 
    /* v contains x */ 
} else { 
    /* v does not contain x */ 
} 

prüft v Elemente enthält (nicht leer):

if(!v.empty()){ 
    /* v is non-empty */ 
} else { 
    /* v is empty */ 
} 
+13

Was passiert, wenn x das letzte Element in v ist? –

+52

David, end() zeigt auf eins nach dem letzten Element, also klappt alles. –

+2

Wird die numerische Toleranz berücksichtigt, wenn versucht wird festzustellen, ob sich ein Double im Vektor befindet? –

9

Siehe Frage: How to find an item in a std::vector?

Sie auch schon ein geeignetes operator==() für Ihr Objekt implementiert, um sicherzustellen, Sie müssen, wenn die Standard-Programm nicht zu einem „tiefen“ Gleichheitstest ist .

73

Wenn für ein Element der Suche wichtig ist, würde ich empfehlen, std::set anstelle von std::vector. (. Dh myset.find(x)): Mit dieser

std::find(vec.begin(), vec.end(), x) läuft in O (n) Zeit, aber std::set hat seine eigene find() Element, das in O läuft (log n) Zeit - das ist viel effizienter mit einer großen Anzahl von Elementen

std::set garantiert auch, dass alle hinzugefügten Elemente einzigartig sind, was Sie davor bewahrt, irgendetwas wie zu tun.

+1

Großartig !!! Ich schreibe einen Lexer. Sätze sind viel besser als Vektoren. Hat 'set' eine' count' Methode wie 'map'? Ich möchte auch den Index des Elements in einer Menge erhalten können. – IAbstract

+1

Ausgezeichnete Informationen! Vielen Dank für die Beantwortung der Frage und die Bereitstellung einer zusätzlichen Lösung. – CodeMouse92

+3

Das ist ein schlechter Rat. Wenn Leistung wichtig ist, Profil. Es gibt keine Garantie, dass die Komplexitätsanalyse zu Ihrem spezifischen Problem etwas zu sagen hat. –

Verwandte Themen