如果容器具有字符串类型的数据,则可以使用move_iterator将数据从源容器移动到目标容器。Move_iterator不对容器中的其他数据类型进行操作。
move_iterator工作正常
#include <iostream> // std::cout
#include <iterator> // std::move_iterator
#include <vector> // std::vector
#include <string> // std::string
#include <algorithm> // std::copy
using namespace std;
int main () {
vector<string>src = {"one", "two", "three", "four"}, des(4);
using Iter = vector<string>::iterator;
//move the data from src to des
move_iterator<Iter>beginitr(src.begin());
move_iterator<Iter>enditr(src.end());
Iter diter = des.begin();
while(beginitr != enditr)
{
*diter++ = *beginitr++;
}
cout << "src container size: " << src.size() << endl;
cout << "data: " ;
for_each(begin(src),end(src), [](string x){cout << x ;});
cout << endl << "THE END";
return 0;
}
输出
src容器大小:4数据:THE END
move_iterator不移动数据
#include <iostream> // std::cout
#include <iterator> // std::move_iterator
#include <list> // std::vector
#include <string> // std::string
#include <algorithm> // std::copy
using namespace std;
int main () {
list<int>src = {1,2,3,4}, des(4);
using Iter = list<int>::iterator;
//move the data from src to des
move_iterator<Iter>beginitr = make_move_iterator(src.begin());
move_iterator<Iter>enditr = make_move_iterator(src.end());
Iter diter = des.begin();
while(beginitr != enditr)
{
*diter++ = *beginitr++;
}
cout << "src container size: " << src.size() << endl;
for_each(begin(src),end(src), [](int x){cout << x << endl;});
return 0;
}
输出
src容器大小:四一二三四
看来整数数据被复制到目标容器而不是被移动。
1条答案
按热度按时间eiee3dmh1#
使用move迭代器的唯一区别是,对迭代器的解引用会产生右值引用。如果只有复制赋值操作符可用,而没有移动赋值操作符,则这将用作“回退”。
下面的代码演示了这一点:
输出
#if 0
保持原样:定义了移动语义的输出(
#if 1
而不是#if 0
):Godbolt演示
对于像
int
这样的算术类型,只有复制语义,没有移动语义,在代码中不修改源列表。