Voglio confrontare due set utilizzando l'algoritmo equal
ma mi sta dando un errore. Come è possibile sapere se due set sono uguali o no?Come confrontare in modo efficiente gli insiemi in C++?
if(equal (a.begin(), a.end(), v.begin(), v.end())
Voglio confrontare due set utilizzando l'algoritmo equal
ma mi sta dando un errore. Come è possibile sapere se due set sono uguali o no?Come confrontare in modo efficiente gli insiemi in C++?
if(equal (a.begin(), a.end(), v.begin(), v.end())
Si può semplicemente dire a == v
, o forse . È efficiente come può essere. a.size() == v.size() && a == v
(Quest'ultima forma con il controllo esplicita dimensione può essere meglio, perché set iteratori non sono ad accesso casuale.) Aggiornamento: Il controllo della dimensione è implicito
Vorrei esitare nel dire che 'a == b' è il più veloce ed efficiente possibile, in quanto potrebbe o meno effettuare confronti extra dietro le quinte. Senza conoscere l'implementazione, non si può dire che sia il 'più veloce' là fuori. –
@ RichardJ.RossIII: Ma conosciamo l'implementazione, dal momento che è specificata. –
Ho pensato che l'implementazione stessa non è specificata, solo il comportamento, corretto? Diverse implementazioni STL possono essere diverse. –
si rischia invocando la std::equal
overload prendendo 3 [grazie @juanchopanza!] iteratori e un predicato aggiuntivo. Quindi, basta lasciare via la seconda estremità, dal momento che non viene interpretato come un iteratore fine, ma un predicato, che è spazzatura:
std::equal(a.begin(), a.end(), v.begin())
Ma, come Mark ammends nel suo commento in questo caso si deve fare certo che le dimensioni di entrambi i contenitori coincidano in anticipo, altrimenti si corre il rischio di correre oltre la fine del secondo set. Si noti che C++ 14 introdurrà in effetti un sovraccarico di std::equal
con quattro iteratori (che è ciò che si intendeva) e che preformerà implicitamente il controllo della dimensione, ma sembra che l'implementazione non lo supporti ancora.
Diverso da quello le altre risposte e commenti sono corretti in quanto a == v
è molto più semplice, più chiaro e più snella.
Nota che se usi 'std :: equal' dovrai anche controllare prima se i contenitori hanno le stesse dimensioni, altrimenti potresti finire alla fine del secondo. –
@MarkRansom Sì, davvero. –
hai provato 'a == v'? –