【问题标题】:How do I check if a value is contained in a vector? C++ [duplicate]如何检查向量中是否包含值? C++ [重复]
【发布时间】:2011-05-13 23:01:52
【问题描述】:

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

代码如下:

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

【问题讨论】:

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


    【解决方案1】:

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

    std::vector<double> vec();
    

    应该变成

    std::vector<double> vec;
    

    如果您保持原样,它会认为该行是名为 vec 的函数的函数原型,不带参数并返回 std::vector&lt;double&gt;,这就是您收到编译器错误的原因。

    是的,您用于查找项目的代码将起作用(称为线性搜索)。另外,如果您愿意,可以使用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 标头。

    【讨论】:

    • 太棒了,效果很好!感谢其他人也有重叠的答案!
    • 仅供参考,如果未找到匹配项,std::find 将返回最后一个元素,这就是存在 != vec.end() 的原因
    • vec.end() 不返回最后一个元素,它返回past-the-end 元素。否则你将无法匹配最终项目。
    【解决方案2】:
    std::vector<double> vec();
    

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

    std::vector<double> vec;
    

    【讨论】:

    • 这是一个很好的观点,但没有回答这个问题。无论如何,我可能已经投票了,因为它很有帮助。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 2018-04-23
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多