En C++ comprobar si std::vector contiene un cierto valor [duplicate]

3 minutos de lectura

avatar de usuario
Jaime

¿Hay alguna función integrada que me diga que mi vector contiene un elemento determinado o no, por ejemplo?

std::vector<string> v;
v.push_back("abc");
v.push_back("xyz");

if (v.contains("abc")) // I am looking for one such feature, is there any
                       // such function or i need to loop through whole vector?

  • stackoverflow.com/questions/507884/…

    – ben

    8 de noviembre de 2012 a las 2:28

  • A partir de C++ 11, esta pregunta ya no es un duplicado, ya que std::any_of ahora le brinda una forma específica de devolver verdadero si un contenedor CONTIENE una coincidencia, en lugar de usar std::find para devolver un elemento coincidente. Gracias a @colddie por la respuesta correcta original a esto.

    – Nanki

    15 de junio de 2015 a las 9:47

  • Relacionado: stackoverflow.com/a/31933118/8781554

    – Xam

    8 de marzo de 2018 a las 0:46

avatar de usuario
AVH

Puedes usar std::find como sigue:

if (std::find(v.begin(), v.end(), "abc") != v.end())
{
  // Element in vector.
}

Para poder usar std::find: include <algorithm>.

  • ¿Y si lo que intento buscar es argvque no es un vector o una matriz (estoy tratando de ver si una cierta opción de argumento de línea de comando está presente en el pasado argv)? Creé un vector que contiene todos los “elementos” de argv y apliqué su solución, aunque no estoy seguro de qué tan limpia es.

    – estilo pretzl

    29 de noviembre de 2017 a las 22:45

  • @jfollowed std::string const searchStr = "magic"; auto result = std::find_if(argv + 1, argv + argc, [&](char const * const arg) { return arg == searchStr; }); obras. Sin embargo, no es tan limpio y conciso. Necesitará al menos C++ 11 para que se compile.

    – AVH

    30 de noviembre de 2017 a las 7:56


avatar de usuario
alex b

  1. Si su contenedor solo contiene valores únicos, considere usar std::set en cambio. Permite consultar la pertenencia a un conjunto con complejidad logarítmica.

     std::set<std::string> s;
     s.insert("abc");
     s.insert("xyz");
     if (s.find("abc") != s.end()) { ...
    
  2. Si su vector se mantiene ordenado, use std::binary_searchtambién ofrece complejidad logarítmica.

  3. Si todo lo demás falla, vuelve a std::findque es una búsqueda lineal simple.

  • Aún mejor, si no necesita un orden en las cadenas, use un std::tr1::unordered_set<std::string>Disponible de <tr1/unordered_set> o <unordered_set>, que tiene un tiempo de búsqueda y consulta (casi) constante. Con set o unordered_set puedes decir alternativamente if (s.count("abc")). no te olvides de aceptar una de las respuestas

    – KerrekSB

    8 de junio de 2011 a las 11:05


  • Estos tres enlaces parecen enlazar con páginas ahora archivadas.

    – glhrmv

    09/04/2018 a las 15:32


avatar de usuario
resfriado

En C++ 11, puede usar std::any_of en cambio.

Un ejemplo para encontrar si hay algún cero en la matriz:

std::array<int,3> foo = {0,1,-1};
if ( std::any_of(foo.begin(), foo.end(), [](int i){return i==0;}) )
std::cout << "zero found...";

  • Encuentro any_of mucho mejor que find, porque find devuelve un vector iterador al elemento, y any_of devuelve un booleano y mucho más adecuado para los casos

    – TripleS

    11 de enero de 2017 a las 10:13

  • ¿Puedes agregar algún detalle más? Un ejemplo de cómo usar y un enlace a la documentación.

    – jb

    5 de diciembre de 2017 a las 11:20

  • @JamieBullock, ¿has visto esta respuesta?

    – Xam

    8 de marzo de 2018 a las 0:44

  • @Xam Gracias. yo se como usar any_ofestaba alentando a Colddie a mejorar la respuesta.

    – jb

    8 de marzo de 2018 a las 8:20

está dentro <algorithm> y llamó std::find.

std::find().

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad