2008-11-12 4 views

Antwort

11

Ja, es gibt eine set_difference Funktion im Header des Algorithmus.

Edits:

FYI, die eingestellte Datenstruktur ist in der Lage, dass Algorithmus effizient zu nutzen, wie es in seinem documentation angegeben. Der Algorithmus funktioniert auch nicht nur auf Mengen, sondern auf jedem Paar von Iteratoren über sortierten Sammlungen.

Wie andere erwähnt haben, ist dies ein externer Algorithmus, keine Methode. Vermutlich ist das für Ihre Bewerbung in Ordnung.

+1

Es ist verwendbar auf _jeder_ Paaren sortierten Behälter. – xtofl

+0

Guter Punkt ... Ich habe eine Notiz in den Änderungen hinzugefügt. –

1

nicht als Methode, aber es gibt die externe Algorithmus Funktion set_difference

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

Ja gibt es, es ist in <algorithm> und heißt: std::set_difference. Die Nutzung ist:

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

Am Ende der Satz result die s1-s2 enthalten.

+0

+1. Leider, wenn ich das brauchte, gab ich auf und rollte meine eigene Schleife :( – peterchen

+38

BTW, wenn Sie set_difference auf eine nicht-assoziative Container-Klasse, sagen ein Vektor, stellen Sie sicher, dass die Elemente in beiden Containern zuerst sortiert sind ... ? – paxos1977

+4

# include -> Keine solche Datei sollte stefanB

2

Die gewählte Antwort ist korrekt, hat aber einige Syntaxfehler.

Statt

#include <algorithms> 

Verwendung

#include <algorithm> 

Statt

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

Verwendung

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

oder einfach' std :: inserter (result, result.end()) ' – rlbond

0

können wir zur Rettung verwenden nur steigern Sobald

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

' std :: back_inserter' benötigt die Methode 'push_back()' für den Zielcontainer 'result'. Dies funktioniert nicht, wenn' result' ein 'std :: set' ist – Attila

1

wieder:

#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 wird set0-set1 enthalten.

0

C++ keinen Satz Differenzoperator definieren, aber Sie können Ihren eigenen (unter Verwendung von Code gegeben in anderen Antworten) definieren:

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; 
}