2011-05-13 10 views
5

Tengo un vector que estoy tratando de realizar contiene una función. Recibo algún tipo de error de lanzamiento y no puedo armar una solución. También quiero saber si lo que estoy haciendo es la forma adecuada de verificar si un vector contiene un valor.¿Cómo puedo verificar si un valor está contenido en un vector? C++

Aquí está el código:

#include "stdafx.h" 
#include <vector> 

static void someFunc(double** Y, int length); 
static bool contains(double value, std::vector<double> vec); 

int main() 
{ 
    double doubleArray[] = { 1, 2, 3, 4, 5 }; 
    double *pDoubleArray = doubleArray; 
    int size = sizeof doubleArray/sizeof doubleArray[0]; 

    someFunc(&pDoubleArray, size); 

    return 0; 
} 
static void someFunc(double** Y, int length) 
{ 
    std::vector<double> vec(); 

    for(int i = 0; i < 10; i++) 
    { 
     //error: 'contains' : cannot convert parameter 2 from 'std::vector<_Ty> (__cdecl *)(void)' to 'std::vector<_Ty>' 
     if(contains(*(Y[i]), vec)) 
     { 
      //do something 
     } 
    } 

} 
static bool contains(double value, std::vector<double> vec) 
{ 
    for(int i = 0; i < vec.size(); i++) 
    { 
     if(vec[i] == value) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

Respuesta

22

Cuando se declara una variable con su constructor por defecto, usted no pone () después de que (aunque es opcional cuando se utiliza new para asignar espacio en la tienda libre). Así que esta línea:

std::vector<double> vec(); 

debe convertirse en

std::vector<double> vec; 

Si lo deja como lo hizo, se cree que la línea es un prototipo de función de una función llamada vec teniendo ningún parámetro y devolver un std::vector<double>, que es por eso que está obteniendo un error de compilación.

Y sí, su código para encontrar un artículo funcionará (se llama búsqueda lineal). Además, si se desea, se puede utilizar std::find:

if (std::find(vec.begin(), vec.end(), value) != vec.end()) 
    // found value in vec 

Si el vector está en el orden de clasificación, también puede utilizar binary_search que es mucho más rápido que find, y el uso es el mismo exceptobinary_search devuelve una bool en lugar de un iterador (por lo que no necesita probarlo contra vec.end()). Asegúrese de incluir el encabezado algorithm si usa cualquiera de estos.

+3

+1 para respuestas bien formadas! Gran trabajo. –

+1

¡Impresionante, funciona genial! ¡Gracias a otros también que tuvieron respuestas superpuestas! –

+0

FYI, std :: find devuelve el último elemento si no se encuentra la coincidencia, por lo que '! = Vec.end()' está allí – xinthose

5
std::vector<double> vec(); 

Curiosamente, esto hace no declarar una vector utilizando el constructor por defecto. Esto declara una función que no toma argumentos y devuelve un vector. Tal vez puedas probar:

std::vector<double> vec; 
+0

Este es un buen punto, pero no responde la pregunta. Es posible que haya votado de todos modos porque fue útil. – JohnAllen

3

Puede usar std::find para verificar que una estructura de datos STL contenga un cierto valor.

Cuestiones relacionadas