检查元素是否在列表中(包含)

时间:2014-06-10 11:05:45

标签: c++ contains

我有一个元素列表,比如整数,我想检查我的变量(另一个整数)是否是列表中的元素之一。在python我会做:

my_list = [1,2,3,4] # elements
my_var = 3 # my variable
my_var in my_list # returns boolean

如何在C ++中实现?我想过使用std::list,但我找不到find方法。我可以在std::set结构中看到这样的方法。

更深层次的问题是,我的程序被赋予了一些独特的ID(列表,集合,等等),我迭代了一长串输入数据(id)并检查它们是否包含在列表中(boolean)为每个迭代步骤返回的值)。而且我不确定如何在C ++中这样做。

7 个答案:

答案 0 :(得分:52)

您可以使用std::find

bool found = (std::find(my_list.begin(), my_list.end(), my_var) != my_list.end());

您需要加入<algorithm>。它应该适用于标准容器,矢量列表等......

答案 1 :(得分:16)

std::list未提供搜索方法。您可以遍历列表并检查元素是否存在或使用std::find。但我认为你的情况std::set更为可取。前者将花费O(n)时间,但稍后会花费O(lg(n))时间进行搜索。

您可以简单地使用:

if(mySet.find(myVar) != mySet.end()){
      //do whatever
}

答案 2 :(得分:4)

您必须#include <algorithm>,然后才能使用std::find

答案 3 :(得分:1)

使用std::find,例如:

if (std::find(std::begin(my_list), std::end(my_list), my_var) != std::end(my_list))
    // my_list has my_var

答案 4 :(得分:1)

他们真的应该添加一个包装器。像这样:

namespace std
{
    template<class _container,
        class _Ty> inline
        bool contains(_container _C, const _Ty& _Val)
        {return std::find(_C.begin(), _C.end(), _Val) != _C.end(); }
};
...
    if( std::contains(my_container, what_to_find) )
    {

    }

答案 5 :(得分:1)

类似于python的单行解决方案将是(std::set<int> {1, 2, 3, 4}).count(my_var) > 0

最小的工作示例

int my_var = 3;
bool myVarIn = (std::set<int> {1, 2, 3, 4}).count(my_var) > 0;
std::cout << std::boolalpha << myVarIn << std::endl;

根据my_var的值打印truefalse

答案 6 :(得分:0)

像这样声明其他辅助函数:

template <class T, class I >
bool vectorContains(const vector<T>& v, I& t)
{
    bool found = (std::find(v.begin(), v.end(), t) != v.end());
    return found;
}

并像这样使用它:

void Project::AddPlatform(const char* platform)
{
    if (!vectorContains(platforms, platform))
        platforms.push_back(platform);
}

可以在此处找到示例快照:

https://github.com/tapika/cppscriptcore/blob/b7f3d62747494a52a440482e841ffb016a3fc56e/SolutionProjectModel/Project.cpp#L13