2010-01-16 2 views
5

En C++ 98, je peux copier des plages avec l'algorithme std::copy.Existe-t-il un algorithme pour les plages mobiles?

std::copy(source.begin(), source.end(), destination.begin()); 

Existe-t-il un algorithme en C++ 0x qui déplace les éléments de la source à la destination? Ou est std::copy en quelque sorte surchargé d'accepter quelque chose comme itérateurs rvalue - y at-il même une telle chose?

L'algorithme pourrait ressembler à ceci:

#include <utility> 

template<class InputIterator, class OutputIterator> 
OutputIterator mooove(InputIterator first, InputIterator last, OutputIterator result) 
{ 
    for (; first != last; ++first, ++last) *result = std::move(*first); 
    return result; 
} 
+0

Que voulez-vous dire par "déplacer"? –

+0

Appel de l'affectation de déplacement 'operator = (T &&)' à la place de l'affectation de copie 'operator = (const T &)' pour chaque élément de la plage. – fredoverflow

+0

donc l'algorithme va modifier la plage de la source, au lieu de la copie - il va «couper» les éléments? –

Répondre

5

Il semble être dans le latest draft (voir section 25.3.2).

J'ai une copie papier de C++ 03 qui est exactement la même que C++98 (sections 25.2.x) où vous pouvez voir les mêmes algorithmes (sans 'déplacer' évidemment).

+0

Ah, je l'ai trouvé, merci. C'est en fait 25.3.2;) – fredoverflow

0

Juste parce que cette page est un peu déroutant en ce moment ... Il ya un std::move(first, last, dest), OP a été confondu en regardant un vieux projet de C++ 0x. La fonction est définie par la section 25.3.2.

2

Il existe également un adaptateur d'itérateur, std::move_iterator, qui peut être utilisé pour adapter n'importe quel algorithme de plage qui effectue des copies pour déplacer les éléments à la place. std::move(first, last, dest) est juste un wrapper de commodité pour le cas d'utilisation le plus commun - il est sémantiquement équivalent à std::copy(std::move_iterator(first), std::move_iterator(last), dest).

+0

Ah, donc il y a en effet une telle chose comme un "itérateur rvalue" :) – fredoverflow

Questions connexes