我有一个向量,我正在尝试执行包含函数。我收到某种铸造错误,我无法拼凑出一个解决方案。我也想知道我在做什么是检查向量是否包含值的适当方法。
以下是代码:
#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;
}
答案 0 :(得分:23)
当您使用默认构造函数声明变量时,不要在其后面添加()
(尽管当您使用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
标题。
答案 1 :(得分:5)
std::vector<double> vec();
奇怪的是,不使用默认构造函数声明vector
。这声明了一个不带参数的函数并返回vector
。试试这个:
std::vector<double> vec;
答案 2 :(得分:3)
您可以使用std::find检查STL数据结构是否包含特定值。