2010-11-01 12 views

risposta

35

Prova questa:

if (std::includes(set_one.begin(), set_one.end(), 
        set_two.begin(), set_two.end())) 
{ 
// ... 
} 

Chi includes().

Il include() algoritmo confronta due sequenze ordinate e restituisce vero se ogni elemento nel range [start2, finish2) è contenuta nel range [start1, Finish1). In caso contrario restituisce false . include() presuppone che le sequenze siano ordinate utilizzando l'operatore <() o utilizzando il predicato comp.

viene eseguito in

presso la maggior parte ((Finish1 - start1) + (finish2 - start2)) * 2 - vengono effettuate 1 confronti.

Più O (nlog (n)) per l'ordinamento di vettori. Non lo capirai più velocemente di così.

+0

Credo che std :: set_intersection funzionerà come sopra (cioè (2 * (count1 + count2)) - 1 operazioni) – Nim

+3

Beh, il caso peggiore è lo stesso, ma se il risultato è falso l'include farà il suo lavoro più veloce. E tu usi anche un altro vettore in intersezione. Poiché i nomi suggeriscono che set_intersection dovrebbe essere usato per trovare quell'intersezione e include per verificare se un set è un sottoinsieme di un altro. – Klark

+2

se i tuoi dati sono in 'std :: set' puoi usare' std :: set_difference' –

Problemi correlati