So hängen Sie ein Listenobjekt <T> an ein anderes an

90

In C ++ habe ich zwei list<T>Objekte Aund Bmöchte alle Mitglieder von Bam Ende von hinzufügen A. Ich habe ein paar verschiedene Quellen durchsucht und keine einfache Lösung (ei A.append(B);) gefunden, was mich ein wenig überrascht.

Was ist der beste Weg, dies zu tun?

Zufällig interessiert mich B danach nicht mehr (es wird in der nächsten Zeile gelöscht). Wenn es also eine Möglichkeit gibt, dies für eine bessere Leistung zu nutzen, interessiert mich das auch.

BCS
quelle

Antworten:

190

Wenn Sie Kopien von Elementen in B anhängen möchten , haben Sie folgende Möglichkeiten:

a.insert(a.end(), b.begin(), b.end());

Wenn Sie Elemente von B an das Ende von A verschieben möchten (wobei B gleichzeitig geleert wird), haben Sie folgende Möglichkeiten:

a.splice(a.end(), b);

In Ihrer Situation wäre das Spleißen besser, da nur einige Zeiger in den verknüpften Listen angepasst werden müssen.

Onkel Bens
quelle
8
+1. So richtig. Wenn es so einfach und effizient gewesen wäre, Karten und Sets zu "schneiden" ...
paercebal
Ist eine dieser Operationen O (1)?
Chris Redford
2
Ich denke, Spleiß sollte für den obigen Fall O (1) sein.
Chunkyguy
9
Es ist O (1) für a.splice(a.end(), b)und a.splice(a.end(), b, it_b_start), aber es ist O (n) für a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai
8
Warum, o warum, konnte STL nicht einfach a.append (b) unterstützen?
srking
-3

Ein Beispiel mit Boost

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
serup
quelle