c++ find - controlla se uno std::vector contiene un certo oggetto?




element 11 (4)

Vedi domanda: come trovare un oggetto in un vettore std ::?

Dovrai anche assicurarti di aver implementato un operator==() adatto operator==() per il tuo oggetto, se quello predefinito non è sufficiente per un test di uguaglianza "approfondito".

Possibile duplicato:
Come trovare un oggetto in un vettore std ::?

C'è qualcosa in <algorithm> che ti permette di controllare se un std :: container contiene qualcosa? Oppure, un modo per crearne uno, ad esempio:

if(a.x == b.x && a.y == b.y)
return true;

return false;

Questo può essere fatto solo con std::map dato che usa le chiavi?

Grazie


Se la ricerca di un elemento è importante, raccomanderei std::set invece di std::vector . Usando questo:

std::find(vec.begin(), vec.end(), x) gira in tempo O (n), ma std::set ha il suo membro find() (es. myset.find(x) ) che gira in tempo O (log n): è molto più efficiente con un gran numero di elementi

std::set garantisce anche che tutti gli elementi aggiunti siano unici, il che ti evita di dover fare qualcosa come if not contained then push_back()...


Verifica che v contenga l'elemento x :

#include <algorithm>

if(std::find(v.begin(), v.end(), x) != v.end()) {
    /* v contains x */
} else {
    /* v does not contain x */
}

Controllare se v contiene elementi (non è vuoto):

if(!v.empty()){
    /* v is non-empty */
} else {
    /* v is empty */
}

Che ne dici di utilizzare un'altra mappa internamente che memorizza valore, combinazione di tasti. Quindi posso chiamare find su di esso?

Sì: mantieni due mappe, con una mappa usando un tipo di chiave e l'altra usando l'altra.

Find () in std :: map esegue la ricerca sequenziale?

No è una ricerca binaria di un albero ordinato: la sua velocità è O (log (n)).





c++ vector