como anexar um objeto list <T> a outro


92

em C ++, tenho dois list<T>objetos Ae Be eu quero adicionar todos os membros Baté o final do A. Pesquisei algumas fontes diferentes e não encontrei uma solução simples (ei A.append(B);) e isso me surpreendeu um pouco.

Qual é a melhor maneira de fazer isso?

Acontece que não me importo com B depois disso (ele é excluído na linha seguinte), então, se houver uma maneira de alavancar isso para um melhor desempenho, também estou interessado nisso.

Respostas:


192

Se desejar anexar cópias de itens em B, você pode fazer:

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

Se você quiser mover itens de B para o final de A (esvaziando B ao mesmo tempo), você pode fazer:

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

Na sua situação, o splicing seria melhor, pois envolve apenas o ajuste de alguns ponteiros nas listas vinculadas.


8
+1. Tão certo. Se pudesse ter sido tão fácil e eficiente "fatiar" mapas e conjuntos ...
paercebal

Alguma dessas operações é O (1)?
Chris Redford

2
Eu acho que a emenda deve ser O (1) para o caso acima.
chunkyguy

9
É O (1) para a.splice(a.end(), b)e a.splice(a.end(), b, it_b_start), mas é O (n) para a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai

9
Por que, ou por que, o STL não poderia apenas suportar a.append (b)?
dia

-3

um exemplo usando impulso

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 ); }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.