Ich verwende Multitreading und möchte die Ergebnisse zusammenführen. Beispielsweise:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Ich möchte, dass AB den Inhalt von A und den Inhalt von B in dieser Reihenfolge hat. Was ist der effizienteste Weg, so etwas zu tun?
Antworten:
quelle
Genau dafür ist die Member-Funktion
std::vector::insert
gedachtquelle
insert
Iteratoren mit wahlfreiem Zugriff spezialisiert und im Voraus reserviert wäre.distance
eine O (1) -Komplexität aufweist). Die Leistungsgarantien voninsert
sind jedoch zu beachten, wenn Sie durch vorausschauende Planung häufig bessere Ergebnisse erzielen können.size < capacity
die Verzweigungsvorhersage die meiste Zeit wahrscheinlich dazu führt, dass sich die Befehle der nicht neu zugewiesenen Verzweigung in der Befehlspipeline befinden, wird die durch Verzweigungen induzierte Latenz minimiert, mit Ausnahme einer geringen Iterationszahl. Dies setzt eine gute Vektorimplementierung sowie eine CPU-Befehlspipeline und eine [gute] Verzweigungsvorhersage voraus, aber dies sind ziemlich zuverlässige Annahmen für eine moderne Toolchain und Desktop-Maschine. Ich weiß aber nichts über Smartphones.Hängt davon ab, ob Sie die beiden Vektoren wirklich physisch verketten müssen oder ob Sie aus Gründen der Iteration den Anschein einer Verkettung erwecken möchten. Die Funktion boost :: join
http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html
werde dir das geben.
sollte dir geben
Hinweis boost :: join kopiert die beiden Vektoren nicht in einen neuen Container, sondern generiert ein Paar Iteratoren (Bereich), die die Spanne beider Container abdecken. Es wird einen gewissen Leistungsaufwand geben, aber möglicherweise weniger, als zuerst alle Daten in einen neuen Container zu kopieren.
quelle
Basierend auf der Antwort von Kiril V. Lyadvinsky habe ich eine neue Version erstellt. Dieses Snippet verwendet Vorlage und Überladung. Damit können Sie schreiben
vector3 = vector1 + vector2
undvector4 += vector3
. Hoffe es kann helfen.quelle
::
wird genommen;)v1 + v2
dies keine Addition darstellt.@
wie in F # zu verwendenIn Richtung Bradgonesurfing Antwort, hat oft ein nicht wirklich braucht zwei Vektoren verketten (O (n)), sondern nur mit ihnen arbeiten , als ob sie verkettet wurden (O (1)) . Wenn dies der Fall ist, können Boost-Bibliotheken benötigt werden.
Der Trick besteht darin, einen Vektor-Proxy zu erstellen: eine Wrapper-Klasse, die Verweise auf beide Vektoren manipuliert , die extern als ein einziger zusammenhängender Vektor betrachtet werden .
VERWENDUNG
IMPLEMENTIERUNG
Hauptnutzen
Es ist O (1) (konstante Zeit), um es zu erstellen, und mit minimaler zusätzlicher Speicherzuweisung.
EINIGES PERSONAL ZU ÜBERLEGEN
quelle
Eine weitere einfache Variante, die noch nicht erwähnt wurde:
Und mit dem Merge-Algorithmus:
quelle
Wenn Ihre Vektoren * sortiert sind, überprüfen Sie set_union unter <Algorithmus>.
Der Link enthält ein ausführlicheres Beispiel
* danke rlbond
quelle
Alle Lösungen sind korrekt, aber ich fand es einfacher, einfach eine Funktion zu schreiben, um dies zu implementieren. so was:
Auf diese Weise können Sie die vorübergehende Platzierung wie folgt vermeiden:
quelle