Min*_*wth 7 c++ casting vector most-vexing-parse
我有一个向量,我试图执行包含函数.我收到某种铸造错误,我无法拼凑出一个解决方案.我也想知道我在做什么是检查向量是否包含值的适当方法.
这是代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Set*_*gie 24
当你用它的默认构造函数声明一个变量时,你不要把()它放在它之后(虽然当你用来new在free store上分配空间时它是可选的).所以这一行:
std::vector<double> vec();
Run Code Online (Sandbox Code Playgroud)
应该成为
std::vector<double> vec;
Run Code Online (Sandbox Code Playgroud)
如果你保留它,它会认为该行是一个函数的函数原型,称为vec不带参数并返回a std::vector<double>,这就是你得到编译器错误的原因.
是的,您查找项目的代码将起作用(称为线性搜索).如果你愿意,你可以使用std::find:
if (std::find(vec.begin(), vec.end(), value) != vec.end())
// found value in vec
Run Code Online (Sandbox Code Playgroud)
如果你的向量是按顺序排列的,你也可以使用binary_search比它更快find的用法,并且除了 binary_search返回a bool而不是迭代器之外,用法是相同的(因此你不需要对它进行测试vec.end()).algorithm如果您使用其中任何一个,请确保包含标题.
std::vector<double> vec();
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这并没有声明vector使用默认构造函数.这声明一个函数不带参数并返回一个vector.试试这个:
std::vector<double> vec;
Run Code Online (Sandbox Code Playgroud)