首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++迭代器(iterator)

  • 25-04-22 20:41
  • 4077
  • 10716
juejin.cn

C++迭代器(iterator)

1、迭代器的介绍

迭代器是一个对象,提供遍历容器内元素的方法,可以访问、修改容器中的元素。

虽然迭代器可以被认为是一个指向容器元素的指针,但迭代器更加灵活,比如迭代器可以访问分段储存的容器

c
代码解读
复制代码
 int main()  {      std::vector<int> vtr;      for (int i = 0; i < 10; i++) {          int rm = rand() % 100;          vtr.push_back(rm);     }      for (std::vector<int>::iterator i = vtr.begin(); i != vtr.end(); i++) {          std::cout << *i << " ";     }  }

vector是连续存储的容器

2、类别

2.1 输入迭代器(Input iterator)

输入迭代器是指一类只能进行输入功能且只能单次读取的迭代器,例如istream_iterator就是一个标准的输入迭代器。

istream_iterator 只能用于读取输入流

c
代码解读
复制代码
 int main()  {   std::istream_iterator<int> int_iter(std::cin);//从cin读取int   std::istream_iterator<int> eof;//istream尾后迭代器   std::vector<int> vec;   while (int_iter != eof)//当有数据可供读取时   {   //后置递增运算符,返回迭代器的旧值   //解引用迭代器,获得从流读取的前一个值   vec.push_back(*int_iter++);   }  }

istrem_iterator 具有懒惰求值的特性,只有解引用的时候才会在输入流中读入数据

c
代码解读
复制代码
 int main() {      std::cout << "开始创建 std::istream_iterator..." << std::endl;      // 创建一个从 std::cin 读取整数的输入流迭代器      std::istream_iterator<int> int_iter(std::cin);      std::istream_iterator<int> eof;      std::cout << "std::istream_iterator 创建完成,尚未进行解引用操作。" << std::endl;  ​      std::vector<int> vec;      int count = 0;      while (int_iter != eof) {          std::cout << "即将解引用迭代器,准备读取第 " << count + 1 << " 个值..." << std::endl;          // 解引用 int_iter 获取当前读取的值          int value = *int_iter;          std::cout << "成功读取第 " << count + 1 << " 个值: " << value << std::endl;          // 将读取的值添加到 vec 中          vec.push_back(value);  ​          std::cout << "即将递增迭代器,准备读取下一个值..." << std::endl;          // 递增 int_iter,准备读取下一个值          ++int_iter;          std::cout << "迭代器已递增。" << std::endl;  ​          count++;     }  ​      // 输出读取到的所有整数      std::cout << "读取到的所有整数为: ";      for (int num : vec) {          std::cout << num << " ";     }      std::cout << std::endl;  ​      return 0;  }

2.2 输出迭代器(Output iterator)

与输入迭代器类似,是一类只能进行单次写入操作的迭代器,例如ostream_iterator就是一个标准的输出迭代器。

ostream_iterator 也是一个流迭代器

c
代码解读
复制代码
 int main() {      std::vector<int> vec = { 10, 20, 30, 40, 50 };      std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));      std::cout << std::endl;      return 0;  }

2.3 正向迭代器(Forward iterator)

正向|前向迭代器支持读取和写入操作,支持且仅支持自增运算(向前移动) ,STL库中的大多数容器vector、list等大多提供正向迭代器。

c
代码解读
复制代码
 int main() {      std::forward_list<int> flst = { 1, 2, 3, 4, 5 };      for (std::forward_list<int>::iterator it = flst.begin(); it != flst.end(); ++it) {          std::cout << *it << " ";     }      std::cout << std::endl;      return 0;  }

2.4 双向迭代器(Bidirectional Iterator)

双向迭代器支持正向迭代器的全部功能和自减运算,STL库中的容器vector、list等至少提供双向迭代器。

reverse等泛型算法都需要使用到双向迭代器

c
代码解读
复制代码
 #include  #include  ​  int main() {      std::list<int> last = { 1, 2, 3, 4, 5 };      // 使用反向迭代器进行反向遍历      for (std::list<int>::reverse_iterator it = last.rbegin(); it != last.rend(); ++it) {          std::cout << *it << " ";     }      std::cout << std::endl;      return 0;  }

2.5 随机访问迭代器(Random Access Iterator)

随机访问迭代器额外支持随机访问(例如通过下标访问)

vector 就是一个随机访问迭代器

2.6 迭代器的关系

迭代器们之间形成了独特的层次结构,后一种的迭代器都继承了前一个迭代器的功能。它们大体上的关系可以用式2.6.1表示

式2.6.1

输入|输出迭代器<正向迭代器<双向迭代器<随机访问迭代器

3、构造迭代器

arduino
代码解读
复制代码
 #ifndef MY_ITERATOR_H  #define MY_ITERATOR_H  ​  #include  #include  ​  // 自定义迭代器类  template <typename T>  class MyIterator {  public:      // 定义迭代器的特征      using iterator_category = std::forward_iterator_tag;      using value_type = T;      using difference_type = std::ptrdiff_t;      using pointer = T*;      using reference = T&;  ​      // 构造函数      MyIterator(pointer ptr) : m_ptr(ptr) {}  ​      // 解引用操作符      reference operator*() const { return *m_ptr; }  ​      // 递增操作符(前置)      MyIterator& operator++() {          ++m_ptr;          return *this;     }  ​      // 递增操作符(后置)      MyIterator operator++(int) {          MyIterator temp = *this;          ++(*this);          return temp;     }  ​      // 相等比较操作符      bool operator==(const MyIterator& other) const {          return m_ptr == other.m_ptr;     }  ​      // 不相等比较操作符      bool operator!=(const MyIterator& other) const {          return !(*this == other);     }  ​  private:      pointer m_ptr;  };  ​  // 自定义容器类  template <typename T, size_t N>  class MyContainer {  public:      T data[N];  ​      // 开始迭代器      MyIterator begin() { return MyIterator(data); }  ​      // 结束迭代器      MyIterator end() { return MyIterator(data + N); }  };  ​  #endif // MY_ITERATOR_H ```# C++迭代器(iterator) ## 1、迭代器的介绍 迭代器是一个对象,提供**遍历容器内元素**的方法,可以访问、修改容器中的元素。 > 虽然迭代器可以被认为是一个指向容器元素的指针,但迭代器更加灵活,比如迭代器可以访问分段储存的容器 ```c++ int main() { std::vector<int> vtr; for (int i = 0; i < 10; i++) { int rm = rand() % 100; vtr.push_back(rm); } for (std::vector<int>::iterator i = vtr.begin(); i != vtr.end(); i++) { std::cout << *i << " "; } }

vector是连续存储的容器

2、类别

2.1 输入迭代器(Input iterator)

输入迭代器是指一类只能进行输入功能且只能单次读取的迭代器,例如istream_iterator就是一个标准的输入迭代器。

istream_iterator 只能用于读取输入流

c++
代码解读
复制代码
int main() { std::istream_iterator<int> int_iter(std::cin);//从cin读取int std::istream_iterator<int> eof;//istream尾后迭代器 std::vector<int> vec; while (int_iter != eof)//当有数据可供读取时 { //后置递增运算符,返回迭代器的旧值 //解引用迭代器,获得从流读取的前一个值 vec.push_back(*int_iter++); } }

istrem_iterator 具有懒惰求值的特性,只有解引用的时候才会在输入流中读入数据

c++
代码解读
复制代码
int main() { std::cout << "开始创建 std::istream_iterator..." << std::endl; // 创建一个从 std::cin 读取整数的输入流迭代器 std::istream_iterator<int> int_iter(std::cin); std::istream_iterator<int> eof; std::cout << "std::istream_iterator 创建完成,尚未进行解引用操作。" << std::endl; std::vector<int> vec; int count = 0; while (int_iter != eof) { std::cout << "即将解引用迭代器,准备读取第 " << count + 1 << " 个值..." << std::endl; // 解引用 int_iter 获取当前读取的值 int value = *int_iter; std::cout << "成功读取第 " << count + 1 << " 个值: " << value << std::endl; // 将读取的值添加到 vec 中 vec.push_back(value); std::cout << "即将递增迭代器,准备读取下一个值..." << std::endl; // 递增 int_iter,准备读取下一个值 ++int_iter; std::cout << "迭代器已递增。" << std::endl; count++; } // 输出读取到的所有整数 std::cout << "读取到的所有整数为: "; for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; }

2.2 输出迭代器(Output iterator)

与输入迭代器类似,是一类只能进行单次写入操作的迭代器,例如ostream_iterator就是一个标准的输出迭代器。

ostream_iterator 也是一个流迭代器

C++
代码解读
复制代码
int main() { std::vector<int> vec = { 10, 20, 30, 40, 50 }; std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; return 0; }

2.3 正向迭代器(Forward iterator)

正向|前向迭代器支持读取和写入操作,支持且仅支持自增运算(向前移动),STL库中的大多数容器vector、list等大多提供正向迭代器。

C++
代码解读
复制代码
int main() { std::forward_list<int> flst = { 1, 2, 3, 4, 5 }; for (std::forward_list<int>::iterator it = flst.begin(); it != flst.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }

2.4 双向迭代器(Bidirectional Iterator)

双向迭代器支持正向迭代器的全部功能和自减运算,STL库中的容器vector、list等至少提供双向迭代器。

reverse等泛型算法都需要使用到双向迭代器

C++
代码解读
复制代码
#include #include int main() { std::list<int> last = { 1, 2, 3, 4, 5 }; // 使用反向迭代器进行反向遍历 for (std::list<int>::reverse_iterator it = last.rbegin(); it != last.rend(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }

2.5 随机访问迭代器(Random Access Iterator)

随机访问迭代器额外支持随机访问(例如通过下标访问)

vector 就是一个随机访问迭代器

2.6 迭代器的关系

迭代器们之间形成了独特的层次结构,后一种的迭代器都继承了前一个迭代器的功能。它们大体上的关系可以用式2.6.1表示

式2.6.1

输入|输出迭代器<正向迭代器<双向迭代器<随机访问迭代器

3、构造迭代器

C++
代码解读
复制代码
#ifndef MY_ITERATOR_H #define MY_ITERATOR_H #include #include // 自定义迭代器类 template <typename T> class MyIterator { public: // 定义迭代器的特征 using iterator_category = std::forward_iterator_tag; using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T*; using reference = T&; // 构造函数 MyIterator(pointer ptr) : m_ptr(ptr) {} // 解引用操作符 reference operator*() const { return *m_ptr; } // 递增操作符(前置) MyIterator& operator++() { ++m_ptr; return *this; } // 递增操作符(后置) MyIterator operator++(int) { MyIterator temp = *this; ++(*this); return temp; } // 相等比较操作符 bool operator==(const MyIterator& other) const { return m_ptr == other.m_ptr; } // 不相等比较操作符 bool operator!=(const MyIterator& other) const { return !(*this == other); } private: pointer m_ptr; }; // 自定义容器类 template <typename T, size_t N> class MyContainer { public: T data[N]; // 开始迭代器 MyIterator begin() { return MyIterator(data); } // 结束迭代器 MyIterator end() { return MyIterator(data + N); } }; #endif // MY_ITERATOR_H

CSDN文章作者同名

注:本文转载自juejin.cn的BC橡木的文章"https://juejin.cn/post/7486873121694662696"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

143
阅读
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top