STL move_iterator使用

STL move_iterator使用教程

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++ 进行编译,具体命令如下:

g++ reverse_iterator.cpp -std=c++11

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

13_STL move_iterator.png

和其他迭代器适配器一样,move_iterator 模板类中也提供有 base() 成员方法,通过该方法,我们可以获取到当前移动迭代器底层所使用的基础迭代器。

STL move_iterator使用总结

STL 中的 move_iterator 的创建有四种方式,即:使用默认构造函数创建一个不指向任何对象的移动迭代器、使用初始化的方式创建、用已有的移动迭代器初始化新建的同类型迭代器和使用 make_move_iterator() 函数创建。