як додати об'єкт списку <T> до іншого


92

в C ++ у мене є два list<T>об'єкти, Aі Bя хочу додати всіх членів Bдо кінця A. Я шукав кілька різних джерел і не знайшов простого рішення (ei A.append(B);), і це мене трохи дивує.

Який найкращий спосіб це зробити?

Як це трапляється, мені після цього байдуже до B (воно видаляється в наступному рядку), тому, якщо є спосіб використати це для кращого виконання, мене це також цікавить.

Відповіді:


192

Якщо ви хочете додати копії елементів у B, ви можете зробити:

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

Якщо ви хочете перемістити елементи B у кінець A (спорожняючи B одночасно), ви можете зробити:

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

У вашій ситуації зрощення було б кращим, оскільки воно просто передбачає коригування декількох покажчиків у зв’язаних списках.


8
+1. Так вірно. Якби це могло бути так легко та ефективно "нарізати" карти та набори ...
paercebal

Чи є одна з цих операцій O (1)?
Кріс Редфорд,

2
Я думаю, сплайсинг повинен мати значення O (1) для наведеного вище випадку.
chunkyguy

9
Це O (1) для a.splice(a.end(), b)і a.splice(a.end(), b, it_b_start), але є O (n) для a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai

9
Чому, o чому, STL не міг просто підтримувати a.append (b)?
серкінг

-3

один приклад використання 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 ); }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.