2010-11-01 17 views

Répondre

35

Essayez ceci:

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

A propos includes().

L'algorithme compare comprend deux séquences triés et renvoie vrai() si chaque élément dans l'intervalle [start2, finish2) est contenu dans la plage [start1, Fin1). Il renvoie false sinon. includes() suppose que les séquences sont triées en utilisant l'opérateur <(), ou en utilisant le prédicat comp.

fonctionne dans

Au plus ((Fin1 - start1) + (finish2 - start2)) * 2 - 1 comparaisons sont effectuées.

Plus O (nlog (n)) pour trier les vecteurs. Vous ne l'aurez pas plus vite que ça.

+0

Je crois que std :: set_intersection effectuera la même chose que ci-dessus (ie (2 * (count1 + count2)) - 1 opérations) – Nim

+3

Eh bien le pire des cas est le même, mais si le résultat est faux les inclus feront leur travail Plus vite. Et vous utilisez également un vecteur de plus dans l'intersection. Comme les noms suggèrent que set_intersection devrait être utilisé pour trouver cette intersection et inclut pour vérifier si un ensemble est un sous-ensemble d'un autre. – Klark

+2

Si vos données sont dans 'std :: set', vous pouvez utiliser' std :: set_difference' –