Führen Sie mehrere Satzelemente in einem einzigen Satz zusammen

70

Ich würde gerne wissen, ob es eine Standardbibliothek oder ein Boost-Tool gibt, mit denen der Inhalt mehrerer Sets einfach zu einem einzigen zusammengeführt werden kann.

In meinem Fall habe ich einige Sätze von Ints, die ich zusammenführen möchte.

codeJack
quelle

Antworten:

126

Sie können so etwas tun wie:

std::set<int> s1;
std::set<int> s2;
// fill your sets
s1.insert(s2.begin(), s2.end());
Nicola Musatti
quelle
2
Ich versuche, den Unterschied zwischen Einfügen für Multiset und Zusammenführen im Zusammenhang mit dem Zusammenführen zu verstehen. Einfügen nimmt O (logn) für jedes Einfügen, also insgesamt O (nlogn); Dabei ist n die Größe des kleineren Behälters. Während das Zusammenführen nur O (n1 + n2) benötigt. Der einzige Grund, den ich mir für die Verwendung von insert vorstellen kann, ist, dass es jeden Iterator akzeptiert und dass die zweite Komplexität einen Koeffizienten von drei vor sich hat. Gibt es einen anderen starken Grund, das Einfügen dem Zusammenführen vorzuziehen?
Sumodds
1
Nicht wirklich, außer dass es, wenn alle Dinge gleich sind, die einfachste und allgemeinste Lösung ist.
Nicola Musatti
2
Dies ist eine suboptimale Lösung. Siehe Antonio Pérez Antwort.
ManuelSchneid3r
1
Nicht nur das: Bei der Bewertung std::set_union()der Leistung sollten Sie die Kosten für std::set::insert()wiederholte Anrufe berücksichtigen .
Nicola Musatti
2
Wahr. Ich habe das Einfügen nicht berücksichtigt, falls die Ausgabe nicht eingestellt ist. Okay, auf diese Weise sind beide in O (n * log (n)) (angenommene Mengen sind gleich). Entschuldigung für das Schimpfen.
ManuelSchneid3r
42

Sieht so aus, als würden Sie danach fragen std::set_union.

Beispiel:

#include <set>
#include <algorithm>

std::set<int> s1; 
std::set<int> s2; 
std::set<int> s3;

// Fill s1 and s2 

std::set_union(std::begin(s1), std::end(s1),
               std::begin(s2), std::end(s2),                  
               std::inserter(s3, std::begin(s3)));

// s3 now contains the union of s1 and s2
Antonio Pérez
quelle
6
Falls Sie die ursprünglichen Strukturen nicht ändern müssen, ist diese Lösung die beste.
Freitass
20

Mit C ++ 17 können Sie die mergeFunktion von setdirekt verwenden.

Dies ist besser, wenn die set2-Elemente im Rahmen des Zusammenführens extrahiert und in set1 eingefügt werden sollen.

Wie unten:

set<int> set1{ 1, 2, 3 };
set<int> set2{ 1, 4, 5 };

// set1 has     1 2 3       set2 has     1 4 5
set1.merge(set2);
// set1 now has 1 2 3 4 5   set2 now has 1   (duplicates are left in the source, set2)
Manohar Reddy Poreddy
quelle
5
en.cppreference.com/w/cpp/container/set/merge. das Komplexitäts-N * -Protokoll (Größe () + N)), wobei N source.size () ist. Ich denke, es ist besser, der Antwort die Komplexität hinzuzufügen, da dies das gleiche ist, als würden alle darin eingefügt?
Y00
1
Ich bin mir nicht sicher, ob Sie die Frage stellen oder raten oder andere. :-) .. Aber Sie haben Recht mit der Komplexität. Da Sie bereits Komplexität hinzugefügt haben, lassen Sie es hier in den Kommentaren +1 sein.
Manohar Reddy Poreddy