簡體   English   中英

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

[英]Check if element is in the list (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)並檢查它們是否包含在列表中(返回的布爾值每個迭代步驟)。 而且我不確定在 C++ 中我應該怎么做。

您可以使用std::find

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

您需要包含<algorithm> 它應該適用於標准容器、向量列表等...

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
}

你必須#include <algorithm> ,然后你可以使用std::find

他們真的應該添加一個包裝器。 像這樣:

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) )
    {

    }

類似於 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

使用std::find ,例如:

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

像這樣聲明額外的輔助函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM