2010-11-22 9 views
6

tengo un código como este ....¿Cómo buscar un elemento en un vector?

std::vector<string>::iterator p; 
p = find(v.begin(),v.end(),"asdasda"); 
cout << *p << endl; 

si "asdasda" no es una parte del vector, p apunta a un poco de basura y cout da un fallo seg. ¿Cuál debería ser la declaración if que haría que el comando cout solo se ejecute si se encontró "asdasda"? y también la posición de "asdasda" en v .. como si anteriormente hubiéramos declarado v [3] como "asdasda", , ¿cómo puedo saber por el hallazgo que v [3] es "asdasda"?

Respuesta

12

p no apunta a "basura", simplemente se convierte en v.end() cuando no se encuentra el contenido.

if (p != v.end()) { 
    std::cout << "v[" << (p - v.begin()) << "] = "; 
    std::cout << *p << std::endl; 
} 
+0

cómo encontrar la posición de "asdasda" en v .. como si anteriormente hubiéramos declarado v [3] como "asdasda", entonces ¿cómo puedo saber por el hallazgo que v [3] es "asdasda"? –

+0

@Prasanth: vea la 2da línea de mi código. – kennytm

+0

@ kenny: gracias .... es v.begin() ..: P –

4

Si std::find no encontrar nada, el iterador se establece en v.end() en este caso.

if (p != v.end()) 
{ 
    // iterator is good 
} 

También tenga en cuenta el caso general de std::find.

He aquí una definición típica de él:

namespace std { 
    template <class InputIterator, class T> 
    InputIterator find(InputIterator start, 
        InputIterator finish, 
        const T& value); 
} 

En caso std::find falla, devolverá el iterador finish porque la búsqueda es [start, finish) e incluye start pero excluye finish.

1

Buscar devuelve el iterador final si no encuentra el valor que busca. Puede evitar su error agregando if (p != v.end()) justo antes de su línea de visualización.

+0

cómo encontrar la posición de "asdasda" en v .. como si hubiéramos declarado anteriormente v [ 3] como "asdasda", ¿cómo puedo saber por el hallazgo que v [3] es "asdasda"? –

+0

'p - v.start()', si 'p! = V.end()'. – Flinsch

Cuestiones relacionadas