2010-11-15 17 views
10

J'ai deux conteneurs, disons qu'ils sont définis comme ceci:Comment gérer 'emplace_range' manquant dans C++ 0x STL?

std::vector<std::unique_ptr<int>> a; 
std::vector<std::unique_ptr<int>> b; 

On suppose à la fois a et b sont peuplées. Je veux insérer le conteneur entier a à un emplacement particulier dans b, en utilisant la sémantique de mouvement afin que les unique_ptr passent à b. Supposons i est un itérateur valide à quelque part dans b. Ce qui suit ne fonctionne pas:

b.insert(i, a.begin(), a.end()); // error: tries to copy, not move, unique_ptrs 

Y at-il un autre algorithme STL qui peut réaliser cette «insérer portée par mouvement? Je suppose que j'ai besoin d'une sorte de emplace_range, mais il n'y en a pas dans le STL de VS2010. Je ne veux pas écrire une boucle qui insère une par une, car elle finirait par un O (n^2) désagréable à cause du décalage de tout le contenu du vecteur à chaque insertion. D'autres options?

Répondre

17
auto a_begin = std::make_move_iterator(a.begin()); 
auto a_end = std::make_move_iterator(a.end()); 

b.insert(i, a_begin, a_end); 
+2

Awesomeness. Je ne connaissais pas 'make_move_iterator'. – AshleysBrain

+1

VS2010 ne supporte pas cela. Bien. –

4

insert Vous devez indiquer le nombre requis d'éléments vides dans la cible (en une fois), puis utiliser swap_ranges. Les éléments sources vont être inutiles de toute façon puisque c'est unique_ptr.

Cette aurait travail pour pré-C++ 0x, mais l'autre réponse est nettement mieux pour Visual C++ 10.

+0

Ce serait, s'il y avait un 'unique_ptr' pre-C++ 0x;) Mais c'est un truc sympa de toute façon. – AshleysBrain