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++.
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 ...
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
}
vous devez #include <algorithm>
, alors vous pouvez utiliser std :: find
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) )
{
}
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
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: