web-dev-qa-db-fra.com

Vérifier si l'élément est dans la liste (contient)

J'ai une liste d'éléments, par exemple des entiers et je veux vérifier si ma variable (un autre entier) est l'un des éléments de la liste. Dans python je ferais ceci:

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

Comment faire cela en C++? J'ai pensé à utiliser std::list, mais je ne trouve aucune méthode find. Je peux voir une telle méthode dans std::set structure.

Plus profondément, le problème est que mon programme reçoit des identifiants uniques (une liste, un ensemble, peu importe) et que je parcours une longue liste de données d'entrée (ids) et vérifie si elles sont incluses dans la liste (valeur booléenne renvoyée pour chaque étape d'itération). Et je ne suis pas sûr de savoir comment faire cela en C++.

31
ducin

Vous pouvez utiliser std::find

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

Vous devez inclure <algorithm>. Cela devrait fonctionner sur des conteneurs standards, des listes de vecteurs, etc ...

57
Matzi

std::list Ne fournit pas de méthode de recherche. Vous pouvez parcourir la liste et vérifier si l'élément existe ou utiliser std::find. Mais je pense que pour votre situation std::set Est préférable. Le premier prendra O(n) temps, mais plus tard, il prendra O(lg(n)) temps de recherche.

Vous pouvez simplement utiliser:

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

vous devez #include <algorithm>, alors vous pouvez utiliser std :: find

4
Radu Chivu

Ils devraient vraiment ajouter un wrapper. Comme ça:

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

    }
2
KungPhoo

Utilisation std::find, quelque chose comme:

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

Déclarez une fonction d'assistance supplémentaire comme ceci:

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

Et utilisez-le comme ceci:

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

Un aperçu de l'exemple peut être trouvé ici:

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

0
TarmoPikaro