2011-05-13 64 views
5

我有一个向量,我正试图执行包含功能。我正在收到某种投射错误,我无法拼凑出一个解决方案。我也想知道我在做什么是检查矢量是否包含值的适当方法。如何检查矢量中是否包含值? C++

下面是代码:

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

回答

22

当你声明一个变量与它的默认构造函数,你不把()后(尽管它当您使用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_searchfind快得多,并且使用的是相同的除了binary_search返回bool而不是一个迭代器(所以你不需要测试它对vec.end())。如果使用其中任何一种,请确保包含algorithm标题。

+3

+1格式良好的答案!做得好。 – 2011-05-13 23:14:03

+1

太棒了,效果很棒!感谢也有重叠答案的其他人! – 2011-05-13 23:15:08

+0

仅供参考,std :: find返回匹配未找到的最后一个元素,这就是为什么'!= vec.end()'在那里 – xinthose 2016-01-07 20:26:24

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

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

std::vector<double> vec; 
+0

这是一个很好的观点,但并没有回答这个问题。无论如何,我可能会赞成,因为它有帮助。 – JohnAllen 2016-04-17 23:49:19

3

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

相关问题