В общем коде я пытался указать итератору вывода (на практике std::back_inserter_iterator
для перемещения диапазона элементов. К моему удивлению это выглядело, как если бы элементы были перемещены в операции move-to-back_inserter.
#include<algorithm> // move
#include<iterator> // back_inserter
#include<vector>
int main(){
std::vector<std::vector<double> > v(10, std::vector<double>(100));
std::vector<std::vector<double> > w;
assert( not v[0].empty() and w.size() == 0 );
std::copy(v.begin(), v.end(), std::back_inserter(w));
assert( not v[0].empty() and w.size() == 10 );
std::move(v.begin(), v.end(), std::back_inserter(w));
assert( v[0].empty() and w.size() == 20 ); // were v elements moved to w?
}
Однако я не думаю, что возможно, что элементы v
действительно были перемещены в w
, потому что в конце концов back_inserter
сделает push_back
, что подразумевает копию в w
.
Представляется более вероятным, что в случае std::move
элементы v
были перемещены во временное и только затем скопированы в w
.
Это правильно?std::back_inserter
действительно как-то движется?
Есть ли уже вариант std::back_inserter
, который использует преимущество перемещения / размещения? Что-то вроде std::back_emplacer
?