2013-06-07 22 views

risposta

12

Si può semplicemente dire a == v, o forse a.size() == v.size() && a == v. È efficiente come può essere. (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

+0

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. –

+0

@ RichardJ.RossIII: Ma conosciamo l'implementazione, dal momento che è specificata. –

+0

Ho pensato che l'implementazione stessa non è specificata, solo il comportamento, corretto? Diverse implementazioni STL possono essere diverse. –

5

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.

+0

Nota che se usi 'std :: equal' dovrai anche controllare prima se i contenitori hanno le stesse dimensioni, altrimenti potresti finire alla fine del secondo. –

+0

@MarkRansom Sì, davvero. –

Problemi correlati