comment ajouter un objet de liste <T> à un autre

92

en C ++, j'ai deux list<T>objets Aet Bet je veux ajouter tous les membres de Bà la fin de A. J'ai cherché plusieurs sources différentes et je n'ai pas trouvé de solution simple (ei A.append(B);) et cela me surprend un peu.

Quelle est la meilleure façon de procéder?

En fait, je ne me soucie pas de B après cela (il est supprimé dans la ligne suivante), donc s'il y a un moyen de tirer parti de cela pour une meilleure performance, cela m'intéresse également.

BCS
la source

Réponses:

193

Si vous souhaitez ajouter des copies d'éléments dans B, vous pouvez faire:

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

Si vous souhaitez déplacer des éléments de B à la fin de A (en vidant B en même temps), vous pouvez faire:

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

Dans votre situation, l'épissage serait mieux, car il s'agit simplement d'ajuster quelques pointeurs dans les listes liées.

OncleBens
la source
8
+1. Tellement vrai. S'il avait pu être si simple et efficace de "découper" des cartes et des décors ...
paercebal
L'une de ces opérations est-elle O (1)?
Chris Redford
2
Je suppose que l'épissure devrait être O (1) pour le cas ci-dessus.
chunkyguy
9
C'est O (1) pour a.splice(a.end(), b)et a.splice(a.end(), b, it_b_start), mais est O (n) pour a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai
9
Pourquoi, o pourquoi, la STL ne pouvait-elle pas simplement supporter a.append (b)?
partir du
-3

un exemple utilisant 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 ); }
serup
la source