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

Posted

技术标签:

【中文标题】检查元素是不是在列表中(包含)【英文标题】:Check if element is in the list (contains)检查元素是否在列表中(包含) 【发布时间】:2014-07-31 02:58:11 【问题描述】:

我有一个元素列表,比如整数,我想检查我的变量(另一个整数)是否是列表中的元素之一。在 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)并检查它们是否包含在列表中(布尔每个迭代步骤返回的值)。而且我不确定我应该如何在 C++ 中做到这一点。

【问题讨论】:

标准::向量。在 c++ 中使用 std::vector 除非你有特殊的理由不这样做。 std::find 是在容器中查找元素的方法 如果要查找值,为什么要使用向量?除非您的列表很小或者您使用稀疏向量并键入索引,否则您肯定希望 std::setstd::multiset 提供比线性搜索更好的性能。 我的列表/集合会很小(几个元素,少于 10 个)。 std::find 更好,因为它独立于容器。 【参考方案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

【讨论】:

【参考方案2】:

std::list 不提供搜索方法。您可以遍历列表并检查元素是否存在或使用std::find。但我认为对于您的情况std::set 更可取。前者需要O(n) 时间,而后者需要O(lg(n)) 时间来搜索。

你可以简单地使用:

int my_var = 3;
std::set<int> mySet 1, 2, 3, 4;
if(mySet.find(myVar) != mySet.end())
      //do whatever

【讨论】:

myset.count(myVar) != 0 可能更可取 std::vector 则更可取 - 因为在大多数情况下它会更快一些。不要仅仅被 Big-O 符号所迷惑,它不会告诉你任何关于实际速度的信息。如果对向量进行了排序,它通常比 set 快很多......如果您甚至考虑使用 set,那么这也意味着您无论如何都可以对向量进行排序。【参考方案3】:

像这样声明额外的辅助函数:

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

【讨论】:

【参考方案4】:

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

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】:

您可以使用std::find

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

您需要包含&lt;algorithm&gt;。它应该适用于标准容器、向量列表等......

【讨论】:

.. 与 C++ 一样简洁。谁需要像contains()这样的微不足道的方法?! @Alex:修复了命名问题。 我觉得添加对 C# 风格的扩展方法的支持可以轻松解决我对 C++ 的所有抱怨。 @Jay STL 必须涵盖所有用例,但要尽可能容易地在 C++ 运行的 70 多个平台之间移植。 contains 将是另一种不添加任何功能的支持方法。您正在寻找类似 Boost 的东西。 c++ 解决方案像往常一样是灾难性的。【参考方案6】:

使用std::find,类似:

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

【讨论】:

【参考方案7】:

你必须#include &lt;algorithm&gt;,然后你可以使用std::find

【讨论】:

以上是关于检查元素是不是在列表中(包含)的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是包含列表的任何元素并获取元素的值?

检查一个列表是不是包含另一个列表中的元素

(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?

派斯帕克;用于检查列是不是包含列表元素之一的 UDF

过滤具有多对多关系的对象,检查它是不是包含列表中的至少一个元素

检查列表是不是包含与某些东西不同的元素[重复]