赞
踩
C++ 11 还为 STL 标准库增添了一种迭代器适配器,即本节要讲的 move_iterator 移动迭代器适配器。
move_iterator 迭代器适配器,又可简称为移动迭代器,其可以实现以移动而非复制的方式,将某个区域空间中的元素移动至另一个指定的空间。
本文作者原创,转载请附上文章出处与本文链接。
C++ STL 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());
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。