STL 中的 move_iterator 的创建有四种方式,即:使用默认构造函数创建一个不指向任何对象的移动迭代器、使用初始化的方式创建、用已有的移动迭代器初始化新建的同类型迭代器和使用 make_move_iterator() 函数创建。
//将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器 typedef std::vector<std::string>::iterator Iter; //调用默认构造函数,创建移动迭代器 std::move_iterator<Iter>mIter;
说明
通过调用该模板类的默认构造函数,可以创建一个不指向任何对象的移动迭代器。
通过上述代码,我们就创建好了一个 mIter 移动迭代器,该迭代器底层使用的是 vector 容器的随机访问迭代器,但这里没有为此基础迭代器明确指向,所以 mIter 迭代器也不知向任何对象。
初始化创建详解
语法
//创建一个 vector 容器 std::vector<std::string> myvec{ "one","two","three" }; //将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器 typedef std::vector<std::string>::iterator Iter; //创建并初始化移动迭代器 std::move_iterator<Iter>mIter(myvec.begin());
说明
在创建 move_iterator 迭代器的同时,也可以为其初始化。这里,我们创建了一个 mIter 移动迭代器,同时还为底层使用的随机访问迭代器做了初始化,即令其指向 myvec 容器的第一个元素。
移动迭代器初始化创建详解
语法
std::move_iterator<Iter>mIter2(mIter); //还可以使用 = 运算符,它们是等价的 //std::move_iterator<Iter>mIter2 = mIter;
说明
move_iterator 模板类还支持用已有的移动迭代器初始化新建的同类型迭代器,这样创建的 mIter2 迭代器和 mIter 迭代器完全一样。也就是说,mIter2 底层会复制 mIter 迭代器底层使用的基础迭代器。
使用make_move_iterator()函数创建详解
语法
template <class Iterator> move_iterator<Iterator> make_move_iterator (const Iterator& it);
说明
C++ STL 标准库中,make_move_iterator() 是以函数模板的形式提供的,其中,参数 it 为基础迭代器,用于初始化新建迭代器。同时,该函数会返回一个创建好的移动迭代器。
案例
创建反向迭代器
使用基础迭代器,创建反向迭代器
#include <iostream> #include <iterator> #include <vector> #include <list> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; typedef std::vector<std::string>::iterator Iter; vector<std::string> myvec{"STL", "Java", "Python", "Golang"}; std::move_iterator<Iter>begin = make_move_iterator(myvec.begin()); std::move_iterator<Iter>end = make_move_iterator(myvec.end()); vector <std::string> othvec(begin.base(), end.base()); cout << "myvec:" << endl; for (auto ch : myvec) { cout << ch << " "; } cout << endl << "othvec:" << endl; for (auto ch : othvec) { cout << ch << " "; } cout << endl; return 0; }
我们在 Linux 下使用 g++ 进行编译,具体命令如下: