Как проверить, содержится ли значение в векторе? C ++ - PullRequest
7 голосов
/ 14 мая 2011

У меня есть вектор, для которого я пытаюсь выполнить функцию содержимого. Я получаю какую-то ошибку приведения и не могу собрать решение. Я также хочу знать, является ли то, что я делаю, правильным способом проверить, содержит ли вектор значение.

Вот код:

#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;
}

Ответы [ 3 ]

23 голосов
/ 14 мая 2011

Когда вы объявляете переменную с ее конструктором по умолчанию, вы не ставите () после нее (хотя это необязательно, когда вы используете new для выделения места в бесплатном хранилище). Итак, эта строка:

std::vector<double> vec();

должно стать

std::vector<double> vec;

Если оставить все как есть, он думает, что строка - это прототип функции функции с именем vec, которая не принимает параметров и возвращает std::vector<double>, поэтому вы получаете ошибку компилятора.

И да, ваш код для поиска предмета будет работать (это называется линейным поиском). Также, если вы хотите, вы можете использовать std::find:

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

Если ваш вектор в отсортированном порядке, вы также можете использовать binary_search, что намного быстрее, чем find, и использование такое же за исключением того, что binary_search возвращает bool вместо итератор (так что вам не нужно проверять его на vec.end()). Убедитесь, что вы включили заголовок algorithm, если используете любой из них.

5 голосов
/ 14 мая 2011
std::vector<double> vec();

Как ни странно, не объявляет vector с помощью конструктора по умолчанию.Это объявляет функцию, не принимающую аргументов и возвращающую vector.Попробуйте вместо этого:

std::vector<double> vec;
3 голосов
/ 14 мая 2011

Вы можете использовать std :: find для проверки структуры данных STL на наличие определенного значения.

...