Controleer of element in de lijst staat (bevat)

Ik heb een lijst met elementen, laten we zeggen gehele getallen, en ik wil controleren of mijn variabele (een ander geheel getal) een van de elementen uit de lijst is. In python zou ik doen:

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

Hoe doe je dat in C++? Ik dacht eraan om std::listte gebruiken, maar ik kan er geen find-methode in vinden. Ik kan een dergelijke methode zien in de structuur std::set.

Meer diepgaand is het probleem dat mijn programma een aantal unieke id’s krijgt (een lijst, een set, wat dan ook) en ik herhaal een lange lijst met invoergegevens (id’s) en controleer of ze in de lijst zijn opgenomen (boolean waarde geretourneerd voor elke iteratiestap). En ik weet niet zeker hoe ik dat in C++ moet doen.


Antwoord 1, autoriteit 100%

U kunt std::find

. gebruiken

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

Je moet <algorithm>opnemen. Het zou moeten werken op standaardcontainers, vectorlijsten, enz…


Antwoord 2, autoriteit 31%

std::listbiedt geen zoekmethode. U kunt de lijst herhalen en controleren of het element bestaat of std::findgebruiken. Maar ik denk dat voor jouw situatie std::setmeer de voorkeur heeft. De eerste zal O(n)tijd kosten, maar later zal O(lg(n))tijd nodig hebben om te zoeken.

U kunt eenvoudig het volgende gebruiken:

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

Antwoord 3, autoriteit 9%

je moet #include <algorithm>, dan kun je std::vinden


Antwoord 4, autoriteit 7%

Ze zouden echt een wikkel moeten toevoegen. Zoals dit:

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

Antwoord 5, autoriteit 3%

Een one-liner-oplossing, vergelijkbaar met python, is (std::set<int> {1, 2, 3, 4}).count(my_var) > 0.

Minimaal werkvoorbeeld

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

drukt trueof falseaf, afhankelijk van de waarde van my_var.


Antwoord 6

Gebruik std::find, zoiets als:

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

Antwoord 7

Verklaar aanvullende helperfunctie als volgt:

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

En gebruik het als volgt:

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

Momentopname van een voorbeeld vindt u hier:

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

Other episodes