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.

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.


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 ); }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.