当前位置:   article > 正文

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

移动迭代器

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

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

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

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

1 move_iterator移动迭代器的创建

2 move_iterator移动迭代器示例


1 move_iterator移动迭代器的创建

  1. //将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器
  2. typedef vector<string>::iterator Iter;
  3. //调用默认构造函数,创建移动迭代器
  4. move_iterator<Iter>mIter;
  5. //创建一个 vector 容器
  6. vector<string> myvec{ "one","two","three" };
  7. //将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器
  8. typedef vector<string>::iterator Iter;
  9. //创建并初始化移动迭代器
  10. move_iterator<Iter>mIter2(myvec.begin());
  11. move_iterator<Iter>mIter3(mIter2);

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

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

2 move_iterator移动迭代器示例

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

  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <string>
  5. using namespace std;
  6. //创建并初始化一个 vector 容器
  7. vector<string> myvec{ "QT","MFC","C++" };
  8. //再次创建一个 vector 容器,利用 myvec 为其初始化
  9. vector<string>othvec(myvec.begin(), myvec.end());
  10. cout << "myvec:" << endl;
  11. //输出 myvec 容器中的元素
  12. for (auto ch : myvec) {
  13. cout << ch << " ";
  14. }
  15. cout << endl << "othvec:" << endl;
  16. //输出 othvec 容器中的元素
  17. for (auto ch : othvec) {
  18. cout << ch << " ";
  19. }

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

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

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

  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <string>
  5. using namespace std;
  6. //创建并初始化一个 vector 容器
  7. vector<string> myvec{ "QT","MFC","C++" };
  8. //再次创建一个 vector 容器,利用 myvec 为其初始化
  9. vector<string>othvec(make_move_iterator(myvec.begin()), make_move_iterator(myvec.end()));
  10. cout << "myvec:" << endl;
  11. //输出 myvec 容器中的元素
  12. for (auto ch : myvec) {
  13. cout << ch << " ";
  14. }
  15. cout << endl << "othvec:" << endl;
  16. //输出 othvec 容器中的元素
  17. for (auto ch : othvec) {
  18. cout << ch << " ";
  19. }

 

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

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

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

  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <string>
  5. using namespace std;
  6. typedef vector<string>::iterator Iter;
  7. //创建并初始化一个 vector 容器
  8. vector<string> myvec{ "QT","MFC","C++" };
  9. //创建 2 个移动迭代器
  10. move_iterator<Iter>begin = make_move_iterator(myvec.begin());
  11. move_iterator<Iter>end = make_move_iterator(myvec.end());
  12. //以复制的方式初始化 othvec 容器
  13. vector <string> othvec(begin.base(), end.base());
  14. cout << "myvec:" << endl;
  15. //输出 myvec 容器中的元素
  16. for (auto ch : myvec) {
  17. cout << ch << " ";
  18. }
  19. cout << endl << "othvec:" << endl;
  20. //输出 othvec 容器中的元素
  21. for (auto ch : othvec) {
  22. cout << ch << " ";
  23. }

通过调用 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/941448
推荐阅读
相关标签
  

闽ICP备14008679号