2010-08-10 26 views
175

Duplicar posible:
How to find an item in a std::vector?comprobar si un std :: vector contiene un determinado objeto?

¿Hay algo en <algorithm> que le permite comprobar si un std :: recipiente contiene algo? O bien, una manera de hacer uno, por ejemplo:

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

return false; 

¿Puede esto sólo se puede hacer con std::map ya que utiliza llaves?

Gracias

+6

std :: find ...... – sje397

+0

Si contiene algo específico, o simplemente no está vacío? –

+2

¿Qué referencia de C++ estás usando? Y el encabezado se llama '' - nota no .h. –

Respuesta

355

Verificando v contiene el elemento x:

#include <algorithm> 

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

Verificando v contiene elementos (no está vacío):

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

¿y si x es el último elemento en v? –

+52

David, end() apunta a uno pasado el último elemento, por lo que todo funciona. –

+2

¿Esto tiene en cuenta la tolerancia numérica cuando se trata de determinar si un doble está en el vector? –

9

Véase la pregunta: How to find an item in a std::vector?

También tendrá que asegurarse de que haya implementado una adecuada operator==() para su objeto, si el defecto no es suficiente para una prueba de igualdad "profunda" .

73

Si la búsqueda de un elemento es importante, me gustaría recomendar std::set en lugar de std::vector. (. Es decir myset.find(x)): El uso de este

std::find(vec.begin(), vec.end(), x) se ejecuta en tiempo O (n), pero std::set tiene su propio find() miembro que se ejecuta en O (log n) tiempo - que es mucho más eficiente con un gran número de elementos

std::set también garantiza que todos los elementos agregados son únicos, lo que le ahorra tener que hacer algo como if not contained then push_back()....

+1

¡¡¡Genial !!! Estoy escribiendo un Lexer. Los conjuntos serán mucho mejores que los vectores. ¿'Set' tiene un método' count' como 'map'? También quiero poder obtener el índice del elemento en un conjunto. – IAbstract

+1

¡Excelente información! Gracias por responder la pregunta correcta y brindar una solución adicional. – CodeMouse92

+3

Este es un mal consejo. Si el rendimiento es importante, perfil. No hay garantía alguna de que el análisis de complejidad tenga algo que decir sobre su problema específico. –

Cuestiones relacionadas