8

我有一个向量,我正在尝试对其执行包含函数。我收到某种类型的转换错误,我无法拼凑出一个解决方案。我也想知道我正在做的是否是检查向量是否包含值的适当方法。

这是代码:

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

3 回答 3

28

当你用它的默认构造函数声明一个变量时,你不要把()它放在后面(尽管当你用来new在自由存储上分配空间时它是可选的)。所以这一行:

std::vector<double> vec();

应该成为

std::vector<double> vec;

如果你保持原样,它认为该行是一个函数的函数原型,称为vec不带参数并返回 a std::vector<double>,这就是你得到编译器错误的原因。

是的,您查找项目的代码将起作用(称为线性搜索)。此外,如果你愿意,你可以使用std::find

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

如果你的向量是有序的,你也可以使用binary_searchwhich 比 快得多find,并且用法是相同的,除了 binary_search返回 abool而不是迭代器(所以你不需要测试它vec.end())。algorithm如果您使用其中任何一个,请确保包含标题。

于 2011-05-13T23:05:05.717 回答
5
std::vector<double> vec();

奇怪的是,这并没有vector使用默认构造函数声明 a 。这声明了一个不带参数并返回 a 的函数vector。试试这个:

std::vector<double> vec;
于 2011-05-13T23:04:52.240 回答
3

您可以使用std::find检查 STL 数据结构是否包含某个值。

于 2011-05-13T23:08:48.460 回答