C++ Encontrando un Elemento en std :: vector


Ejemplo

La función std::find , definida en el encabezado <algorithm> , se puede usar para encontrar un elemento en un std::vector .

std::find usa el operator== para comparar elementos para la igualdad. Devuelve un iterador al primer elemento en el rango que se compara igual al valor.

Si no se encuentra el elemento en cuestión, std::find devuelve std::vector::end (o std::vector::cend si el vector es const ).

C ++ 11
static const int arr[] = {5, 4, 3, 2, 1};
std::vector<int> v (arr, arr + sizeof(arr) / sizeof(arr[0]) );

std::vector<int>::iterator it = std::find(v.begin(), v.end(), 4);
std::vector<int>::difference_type index = std::distance(v.begin(), it);
// `it` points to the second element of the vector, `index` is 1

std::vector<int>::iterator missing = std::find(v.begin(), v.end(), 10);
std::vector<int>::difference_type index_missing = std::distance(v.begin(), missing);
// `missing` is v.end(), `index_missing` is 5 (ie. size of the vector)
C ++ 11
std::vector<int> v { 5, 4, 3, 2, 1 };

auto it = std::find(v.begin(), v.end(), 4);
auto index = std::distance(v.begin(), it);
// `it` points to the second element of the vector, `index` is 1

auto missing = std::find(v.begin(), v.end(), 10);
auto index_missing = std::distance(v.begin(), missing);
// `missing` is v.end(), `index_missing` is 5 (ie. size of the vector)

Si necesita realizar muchas búsquedas en un vector grande, puede considerar ordenar primero el vector, antes de usar el algoritmo de binary_search .


Para encontrar el primer elemento en un vector que satisface una condición, se puede usar std::find_if . Además de los dos parámetros dados a std::find , std::find_if acepta un tercer argumento que es un objeto de función o puntero de función a una función de predicado. El predicado debe aceptar un elemento del contenedor como argumento y devolver un valor convertible a bool , sin modificar el contenedor:

C ++ 11
bool isEven(int val) {
    return (val % 2 == 0); 
}

struct moreThan {
    moreThan(int limit) : _limit(limit) {}
    
    bool operator()(int val) {
        return val > _limit;
    }
    
    int _limit;
};

static const int arr[] = {1, 3, 7, 8};
std::vector<int> v (arr, arr + sizeof(arr) / sizeof(arr[0]) );
    
std::vector<int>::iterator it = std::find_if(v.begin(), v.end(), isEven);
// `it` points to 8, the first even element

std::vector<int>::iterator missing = std::find_if(v.begin(), v.end(), moreThan(10));
// `missing` is v.end(), as no element is greater than 10
C ++ 11
// find the first value that is even
std::vector<int> v = {1, 3, 7, 8};
auto it = std::find_if(v.begin(), v.end(), [](int val){return val % 2 == 0;});
// `it` points to 8, the first even element

auto missing = std::find_if(v.begin(), v.end(), [](int val){return val > 10;});
// `missing` is v.end(), as no element is greater than 10