jak dołączyć obiekt list <T> do innego


94

w C ++ mam dwa list<T>obiekty Ai Bchcę dodać wszystkie składowe Bna końcu A. Przeszukałem kilka różnych źródeł i nie znalazłem prostego rozwiązania (ei A.append(B);) i to mnie trochę zaskakuje.

Jaki jest najlepszy sposób, aby to zrobić?

Tak się składa, że ​​po tym nie obchodzi mnie B (zostaje usunięte w następnej linii), więc jeśli istnieje sposób na wykorzystanie tego dla lepszej perfekcji, to też mnie to interesuje.

Odpowiedzi:


195

Jeśli chcesz dołączyć kopie elementów w B, możesz zrobić:

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

Jeśli chcesz przenieść elementy B na koniec A (opróżnianie B w tym samym czasie), możesz:

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

W twojej sytuacji splicing byłby lepszy, ponieważ wymaga tylko dostosowania kilku wskaźników na połączonych listach.


8
+1. Więc dobrze. Gdyby można było tak łatwo i efektywnie „pokroić” mapy i zestawy ...
paercebal

Czy któraś z tych operacji jest O (1)?
Chris Redford,

2
Myślę, że połączenie powinno być O (1) dla powyższego przypadku.
chunkyguy

9
To jest O (1) dla a.splice(a.end(), b)i a.splice(a.end(), b, it_b_start), ale jest O (n) dla a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai

10
Dlaczego, o dlaczego, STL nie mógł po prostu obsługiwać a.append (b)?
śpiewanie

-3

jeden przykład z użyciem 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 ); }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.