2014-06-10 26 views
22

Ho una lista di elementi, per esempio interi e voglio verificare se la mia variabile (un altro intero) è uno degli elementi della lista. In Python farei:Controlla se l'elemento è nella lista (contiene)

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

Come farlo in C++? Ho pensato di utilizzare std::list, ma non riesco a trovare il metodo find in esso. Riesco a vedere tale metodo nella struttura std::set.

In modo più approfondito, il problema è che al mio programma vengono dati alcuni ID univoci (un elenco, un set, qualsiasi cosa) e I itate su un lungo elenco di dati di input (ID) e controllare se sono inclusi nell'elenco (valore booleano restituito per ogni passaggio di iterazione). E non sono sicuro di come dovrei farlo in C++.

+3

std :: vector. In C++ usa std :: vector a meno che tu non abbia una ragione speciale per non farlo. – user1937198

+0

'std :: find' è il modo in cui cercare elementi in un contenitore – Andro

+0

Perché utilizzare un vettore se stai cercando valori? Sicuramente vorrai un 'std :: set' o' std :: multiset' per ottenere prestazioni migliori rispetto a una ricerca lineare a meno che la tua lista non sia piccola o stai usando un vettore sparse e la digitazione sull'indice. –

risposta

37

È possibile utilizzare std::find

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

È necessario includere <algorithm>. Dovrebbe funzionare su contenitori standard, elenchi di vettori, ecc ...

+28

..concisi come sempre con C++. Chi ha bisogno di un metodo banale come 'contains()' ?! – Jay

+0

@Alex: corretto il nome. – Matzi

+2

Mi sento di aggiungere il supporto per i metodi di estensione in stile C# e risolvere facilmente ogni problema che ho fatto su C++. – BTownTKD

3

è necessario #include <algorithm>, quindi è possibile utilizzare std::find

11

std::list non fornisce un metodo di ricerca. È possibile scorrere l'elenco e controllare se l'elemento esiste o utilizzare std::find. Ma penso che per la tua situazione std::set sia più preferibile. Il primo richiederà il tempo O(n) ma in un secondo momento sarà necessario cercare O(lg(n)).

si può semplicemente utilizzare:

if(mySet.find(myVar) != mySet.end()){ 
     //do whatever 
} 
+1

'myset.count (myVar)! = 0' potrebbe essere preferibile –

1

Usa std::find, qualcosa di simile:

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