Hat die C++ STL-Set-Datenstruktur einen Set-Difference-Operator?C++ STL-Set-Differenz
Antwort
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.
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);
Offenbar tut es.
Nicht ein "Operator" in der Sprache Sinn, aber es ist der set_difference Algorithmus in der Standardbibliothek:
http://www.cplusplus.com/reference/algorithm/set_difference.html
Natürlich sind die anderen Grundsatzvorgänge vorhanden sind, zu - (Union usw.), wie im Abschnitt "Siehe auch" am Ende des verknüpften Artikels vorgeschlagen.
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.
+1. Leider, wenn ich das brauchte, gab ich auf und rollte meine eigene Schleife :( – peterchen
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
# include
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()));
oder einfach' std :: inserter (result, result.end()) ' – rlbond
können wir zur Rettung verwenden nur steigern Sobald
set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)).
' std :: back_inserter' benötigt die Methode 'push_back()' für den Zielcontainer 'result'. Dies funktioniert nicht, wenn' result' ein 'std :: set' ist – Attila
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.
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;
}
Es ist verwendbar auf _jeder_ Paaren sortierten Behälter. – xtofl
Guter Punkt ... Ich habe eine Notiz in den Änderungen hinzugefügt. –