C++ STL move_iterator移动迭代器(深入了解,一文学会)

        C++ 11 还为 STL 标准库增添了一种迭代器适配器,即本节要讲的 move_iterator 移动迭代器适配器。

        move_iterator 迭代器适配器,又可简称为移动迭代器,其可以实现以移动而非复制的方式,将某个区域空间中的元素移动至另一个指定的空间。

   本文作者原创,转载请附上文章出处与本文链接。

C++ STL move_iterator移动迭代器(深入了解,一文学会)目录

1 move_iterator移动迭代器的创建

2 move_iterator移动迭代器示例


1 move_iterator移动迭代器的创建

//将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器
typedef vector<string>::iterator Iter;
//调用默认构造函数,创建移动迭代器
move_iterator<Iter>mIter;


//创建一个 vector 容器
vector<string> myvec{ "one","two","three" };


//将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器
typedef vector<string>::iterator Iter;
//创建并初始化移动迭代器
move_iterator<Iter>mIter2(myvec.begin());
move_iterator<Iter>mIter3(mIter2);

以上 3 种创建 move_iterator 迭代器的方式,其本质都是直接调用 move_iterator 模板类中的构造方法实现的。除此之外,C++ STL 标准库还提供了一个 make_move_iterator() 函数,通过调用此函数可以快速创建一个 move_iterator 迭代器。

typedef vector<string>::iterator Iter;
vector<string> myvec{ "one","two","three" };
//将 make_move_iterator() 的返回值赋值给同类型的 mIter 迭代器
move_iterator<Iter>mIter = make_move_iterator(myvec.begin());

2 move_iterator移动迭代器示例

vector 容器,该类型容器支持如下初始化的方式:

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;
 
//创建并初始化一个 vector 容器
vector<string> myvec{ "QT","MFC","C++" };
//再次创建一个 vector 容器,利用 myvec 为其初始化
vector<string>othvec(myvec.begin(), myvec.end());

cout << "myvec:" << endl;
//输出 myvec 容器中的元素
for (auto ch : myvec) {
	cout << ch << " ";
}
cout << endl << "othvec:" << endl;
//输出 othvec 容器中的元素
for (auto ch : othvec) {
	cout << ch << " ";
}

        初始化 othvec 容器是通过复制 myvec 容器中的元素实现的。也就是说,othvec 容器从 myvec 容器中复制了一份 "STL"、"Python"、"Java" 并存储起来,此过程不会影响 myvec 容器。

那么,如果不想采用复制的方式,而就是想 myvec 容器中存储的元素全部移动到 othvec 容器中,该怎么办呢?没错,就是采用移动迭代器。

运用移动迭代器为 othvec 容器初始化:

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;

//创建并初始化一个 vector 容器
vector<string> myvec{ "QT","MFC","C++" };
//再次创建一个 vector 容器,利用 myvec 为其初始化
vector<string>othvec(make_move_iterator(myvec.begin()), make_move_iterator(myvec.end()));

cout << "myvec:" << endl;
//输出 myvec 容器中的元素
for (auto ch : myvec) {
	cout << ch << " ";
}
cout << endl << "othvec:" << endl;
//输出 othvec 容器中的元素
for (auto ch : othvec) {
	cout << ch << " ";
}

 

 通过和程序一做对比不难看出它们的区别, othvec 容器初始化时,使用的是移动迭代器,其会将 myvec 容器中的元素直接移动到 othvec 容器中。

注意,即便通过移动迭代器将容器中某区域的元素移动到了其他容器中,该区域内仍可能残留有之前存储的元素,但这些元素是不能再被使用的,否则极有可能使程序产生各种其他错误。

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

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;

typedef vector<string>::iterator Iter;
//创建并初始化一个 vector 容器
vector<string> myvec{ "QT","MFC","C++" };
//创建 2 个移动迭代器
move_iterator<Iter>begin = make_move_iterator(myvec.begin());
move_iterator<Iter>end = make_move_iterator(myvec.end());
//以复制的方式初始化 othvec 容器
vector <string> othvec(begin.base(), end.base());

cout << "myvec:" << endl;
//输出 myvec 容器中的元素
for (auto ch : myvec) {
	cout << ch << " ";
}
cout << endl << "othvec:" << endl;
//输出 othvec 容器中的元素
for (auto ch : othvec) {
	cout << ch << " ";
}

通过调用 base() 成员方法,初始化 othvec 容器的方式转变为以复制而非移动的方式,因此 myvec 容器不会受到影响。 

以下博客部分内容借鉴自:http://c.biancheng.net/stl/。

C++ STL 容器、迭代器、适配器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/120052137                                                                                C++ STL deque容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676574
C++ STL vector容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676109
C++ STL list容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118676917
C++ STL forward_list容器(深入了解,一文学会)               https://blog.csdn.net/qq_37529913/article/details/118687348
C++ STL array 容器(深入了解,一文学会)                        https://blog.csdn.net/qq_37529913/article/details/118688364
C++ STL pair 类模板(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118714852
C++ STL map容器(深入了解,一文学会)                           https://blog.csdn.net/qq_37529913/article/details/118741670
C++ STL map emplace()和emplace_hint()(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/118771777
C++ STL multimap容器(深入了解,一文学会)                    https://blog.csdn.net/qq_37529913/article/details/118773021
C++ STL Set容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118918940
C++ STL multiset容器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119624779
C++ STL unordered_map容器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/119689199
C++ STL unordered_set容器(深入了解,一文学会)           https://blog.csdn.net/qq_37529913/article/details/119709019
C++ STL unordered_multiset容器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/119709079
C++ STL stack容器适配器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119723782
C++ STL queue容器适配器(深入了解,一文学会)       https://blog.csdn.net/qq_37529913/article/details/119746246
C++ STL priority_queue容器适配器(深入了解,一文学会)                https://blog.csdn.net/qq_37529913/article/details/119770527
C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)   https://blog.csdn.net/qq_37529913/article/details/119814820
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)      https://blog.csdn.net/qq_37529913/article/details/119834378
C++ STL stream_iterator流迭代器(深入了解,一文学会)                  https://blog.csdn.net/qq_37529913/article/details/119834429
C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119850048
C++ STL move_iterator移动迭代器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119859888
C++ STL advance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008250
C++ STL distance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008300
C++ STL iterator迭代器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008346
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008324
C++ STL begin()和end()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008459
C++ STL prev()和next()函数(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008481

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子座断点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值