c++ - 如何检查一个值是否包含在 vector 中? C++

标签 c++ vector casting most-vexing-parse

<分区>

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

代码如下:

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

最佳答案

当你用它的默认构造函数声明一个变量时,你不会把 ()在它之后(尽管当您使用 new 在免费存储上分配空间时它是可选的)。所以这一行:

std::vector<double> vec();

应该变成

std::vector<double> vec;

如果你保持原样,它会认为该行是名为 vec 的函数的函数原型(prototype)。不带参数并返回 std::vector<double> ,这就是您遇到编译器错误的原因。

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

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

如果你的 vector 是有序的,你也可以使用binary_search这比 find 快得多,用法相同除了 binary_search返回 bool而不是迭代器(因此您无需针对 vec.end() 对其进行测试)。确保包含 algorithm如果您使用其中任何一个,则 header 。

关于c++ - 如何检查一个值是否包含在 vector 中? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5998576/

相关文章:

c++ - 为什么 GCC 似乎没有文件系统标准库?

c++ - QVector 与 Qthreads

c++ - RECT 和 POINT 数组之间的 reinterpret_cast 安全吗?

casting - 特征作为函数的返回值,并显式转换

C++ - 将模板类型对象转换为特定数据类型

c++ - 跳出循环后如何访问地址?

c++ - LNK2001 未解析的外部符号与 CPP_XLOPER

c++ - 使用#ifdefs 进行代码选择会创建丑陋的结构 - 替代方案?

c++ - 返回一个 vector ,这里应用的是 RVO 还是 move 构造函数?

c++ - 修改 std::vector 的底层数据结构不会改变它的大小