2011-04-18 16 views
15

Si sé que un conjunto es un subconjunto de otro conjunto y me gustaría encontrar la diferencia, ¿cuál es la forma más eficiente de hacerlo?Establecer diferencia en C++

ex. PSEUDO CÓDIGO

> set<int> set1 = {1 2 3 4 5 6 7 8 9 10} 
> set<int> set2 = {5 6 7} 

quiero restar set2 de set1:

La respuesta en este caso sería

{1 2 3 4 8 9 10} 
+1

¿Qué le parece? diferencia o intersección? ¡Manten tu pesamiento! ;) – Nim

+2

http://www.cplusplus.com/reference/algorithm/set_difference/ –

+0

posible duplicado de [C++ STL establece la diferencia] (http://stackoverflow.com/questions/283977/c-stl-set-difference) –

Respuesta

22

Uso std::set_difference encontrado en <algorithm>:

#include <algorithm> 
#include <set> 
#include <iterator> 
// ... 
std::set<int> s1, s2; 
// Fill in s1 and s2 with values 
std::set<int> result; 
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), 
    std::inserter(result, result.end())); 

Snippet source

11

me gustaría utilizar std::set_difference, que se ejecuta en O (n) tiempo.

+0

'que se ejecuta en O (n) tiempo' depende de la implementación. – orlp

+3

@nightcracker: no, está garantizado por el estándar. – ybungalobill

+0

@ybungalobill: ¿Algún enlace? – orlp

-1
+0

{1 2 3 4 5 6 7 8 9 10} - {5 6 7 11} incluiría 11? – Will

+0

Sí, lo hará porque no está en el primer conjunto. Ahora veo que OP desea restar un subconjunto (que no incluiría ningún número que no esté en el original) del conjunto. Me emocioné y supuse que solo quería lo diferente entre dos sets. – Pete

0

Puede utilizar std::set_difference función.

el rango de salida contiene una copia de cada elemento que se contiene en [first1, last1) y no contenían en [primero2, ultimo2).

2

sé que solicitó una solución de C++, pero si alguien es aquí en busca de una solución Haskell:

import Data.Set ((\\), fromList) 

main = do 
    let s1 = fromList [1,2,3,4,5,6,7,8,9,10] 
    let s2 = fromList [5,6,7] 
    print $ s1 \\ s2 

Resultados en: [1, 2, 3, 4, 8, 9, 10 ]

+4

Debería vencer, pero amar a Haskell, entonces +1. – lisyarus

+3

Esta pregunta pregunta por C++, no por Haskell. Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). – cpburnz

+2

@cpburnz En realidad, esta respuesta es una broma sobre otra respuesta (ya eliminada), que propuso una solución en Java :) – lisyarus