как добавить объект list‹T› к другому

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

Как это лучше всего сделать?

Как оказалось, после этого меня не волнует B (оно удаляется в самой следующей строке), поэтому, если есть способ использовать это для повышения производительности, я также заинтересован в этом.


person BCS    schedule 19.09.2009    source источник


Ответы (2)


Если вы хотите добавить копии элементов в B, вы можете сделать следующее:

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

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

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

В вашей ситуации сращивание было бы лучше, так как оно просто включает в себя настройку пары указателей в связанных списках.

person UncleBens    schedule 19.09.2009
comment
+1. Так хорошо. Если бы можно было так просто и эффективно нарезать карты и наборы... - person paercebal; 20.09.2009
comment
Является ли любая из этих операций O(1)? - person Chris Redford; 13.03.2013
comment
Я предполагаю, что соединение должно быть O (1) для случая выше. - person chunkyguy; 27.03.2013
comment
Это 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). - person hkBattousai; 08.08.2013
comment
Является ли этот метод атомарным? могу ли я использовать его в параллельной среде? - person orezvani; 27.03.2014
comment
@hkBattousai, интересная часть о планировщике процессов, однако мне может понадобиться больше информации об этой конкретной части, возможно, вы могли бы предоставить ссылку с более подробной информацией о том, почему это O (1) и O (n) ? - person serup; 12.12.2016
comment
Почему, почему STL не может просто поддерживать a.append(b)? - person srking; 08.12.2017

один пример использования 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 ); }
person serup    schedule 12.12.2016