2008-11-12 10 views

Respuesta

11

Sí, hay una función set_difference en el encabezado de los algoritmos.

ediciones:

su información, la estructura de datos del conjunto son capaces de utilizar de manera eficiente que el algoritmo, como se ha dicho en su documentation. El algoritmo también funciona no solo en conjuntos sino en cualquier par de iteradores sobre colecciones ordenadas.

Como han mencionado otros, este es un algoritmo externo, no un método. Presumiblemente eso está bien para su aplicación.

+1

Es utilizable en _cualquier_ par de recipientes ordenados. – xtofl

+0

Buen punto ... He agregado una nota en las ediciones. –

1
No

como método pero no el algoritmo set_difference función externa

template <class InputIterator1, class InputIterator2, class OutputIterator> 
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, 
           InputIterator2 first2, InputIterator2 last2, 
           OutputIterator result); 

http://www.sgi.com/tech/stl/set_difference.html

119

Sí, lo hay, está en <algorithm> y se llama: std::set_difference. El uso es:

#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())); 

Al final, el conjunto result contendrá el s1-s2.

+0

+1. Lamentablemente, cuando lo necesitaba, me daba por vencido y hacía mi propio bucle :( – peterchen

+38

BTW, si usa set_difference en una clase de contenedor no asociativo, digamos un vector, asegúrese de que los elementos en ambos contenedores estén ordenados primero ... ? – paxos1977

+4

# include -> No existe el fichero, debe ser stefanB

2

La respuesta elegida es correcta, pero tiene algunos errores de sintaxis.

En lugar de

#include <algorithms> 

uso

#include <algorithm> 

En lugar de

std::insert_iterator(result, result.end())); 

uso

std::insert_iterator<set<int> >(result, result.end())); 
+7

o simplemente use' std :: inserter (result, result.end()) ' – rlbond

0

¿podemos utilizar

set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)). 
+3

' std :: back_inserter' requires el método 'push_back()' en el 'resultado' del contenedor de destino. Esto no funcionará si 'result' es un' std :: set' – Attila

1

Una vez más, aumentar al rescate:

#include <string> 
#include <set> 
#include <boost/range/algorithm/set_algorithm.hpp> 

std::set<std::string> set0, set1, setDifference; 
boost::set_difference(set0, set1, std::inserter(setDifference, setDifference.begin()); 

setDifference contendrá set0-set1.

0

C++ no define un operador de diferencia de conjuntos, pero se puede definir su propio (usando el código dado en otras respuestas):

template<class T> 
set<T> operator -(set<T> reference, set<T> items_to_remove) 
{ 
    set<T> result; 
    std::set_difference(
     reference.begin(), reference.end(), 
     items_to_remove.begin(), items_to_remove.end(), 
     std::inserter(result, result.end())); 
    return result; 
}