C++迭代器

迭代器有五种不同的功能类型,分别是:

  • 输入迭代器:只能从容器中读取元素,不能修改或删除元素。只能用于单遍扫描算法。

可以使用*->操作符来访问元素,可以使用++操作符来移动迭代器,可以使用==!=操作符来比较迭代器。例如,标准输入流std::cin就是一个输入迭代器。

  • 输出迭代器:只能向容器中写入元素,不能读取或修改元素。只能用于单遍扫描算法。

可以使用*操作符来赋值元素,可以使用++操作符来移动迭代器。例如,标准输出流std::cout就是一个输出迭代器。

  • 前向迭代器:既可以读取也可以写入容器中的元素,还可以多次访问同一个元素。能用于多遍扫描算法。

不能反向移动迭代器。支持输入迭代器和输出迭代器的所有操作,还可以多次访问同一个元素。例如,标准库中的单向链表std::forward_list就使用前向迭代器。

  • 双向迭代器:既可以读取也可以写入容器中的元素,还可以正向或反向移动迭代器。能用于多遍扫描算法。

支持前向迭代器的所有操作,还可以使用--操作符来移动迭代器。例如,标准库中的双向链表std::list就使用双向迭代器。

  • 随机访问迭代器:既可以读取也可以写入容器中的元素,还可以任意跳跃到容器中的任何位置。支持和一个整数值的加减运算、两个迭代器上的减法运算、下标运算符、比较两个迭代器相对位置的关系运算符等。能用于多遍扫描算法。

支持双向迭代器的所有操作,还可以使用+-+=-=[]<><=、和 >= 操作符来移动或比较迭代器。例如,标准库中的向量 std::vector 就使用随机访问迭代器。


不同的容器使用不同类型的迭代器,例如:

  • vector和deque使用随机访问迭代器
  • list和set使用双向迭代器
  • stack和queue不支持迭代器

要使用迭代器,需要包含头文件<iterator>,并使用容器类名后面加上::iterator或::const_iterator来定义迭代器变量

// 输入迭代器(流迭代器)
#include <iostream>
#include <iterator>
int main() {
  std::cout << "Enter some numbers (Ctrl+D to end):\n";
  std::istream_iterator<int> it(std::cin); // 创建输入流迭代器
  std::istream_iterator<int> end; // 创建默认构造的结束标志
  int sum = 0;
  while (it != end) { // 比较两个输入流迭代器
    sum += *it; // 访问输入流中的元素
    ++it; // 移动输入流迭代器
  }
  std::cout << "The sum is " << sum << "\n";
}
// 输出迭代器(流迭代器)
#include <iostream>
#include <iterator>
#include <vector>
int main() {
  std::vector<int> v = {1, 2, 3, 4, 5};
  std::ostream_iterator<int> it(std::cout, " "); // 创建输出流迭代器
  for (int x : v) {
    *it = x; // 向输出流中写入元素
    ++it; // 移动输出流迭代器
  }
  std::cout << "\n";
}
// 前向迭代器
#include <iostream>
#include <forward_list>
int main() {
  std::forward_list<int> fl = {1, 2, 3, 4, 5};
  auto it = fl.begin(); // 创建前向迭代器
  while (it != fl.end()) { // 比较两个前向迭代器
    std::cout << *it << " "; // 访问前向迭代器指向的元素
    ++it; // 移动前向迭代器
  }
  std::cout << "\n";
}
// 双向迭代器
#include <iostream>
#include <list>
int main() {
  std::list<int> li = {1, 2, 3, 4, 5};
  auto it = li.begin(); // 创建双向迭代器
  while (it != li.end()) { // 比较两个双向迭代器
    std::cout << *it << " "; // 访问双向迭代器指向的元素
    ++it; // 移动双向迭代器
  }
  std::cout << "\n";
  while (it != li.begin()) { // 比较两个双向迭代器
    --it; // 移动双向迭代器
    std::cout << *it << " "; // 访问双向迭代器指向的元素
  }
  std::cout << "\n";
}
// 随机访问迭代器
#include <iostream>
#include <vector>
int main() {
  std::vector<int> v = {1, 2, 3, 4, 5};
  auto it = v.begin(); // 创建随机访问迭代器
  std::cout << *it << "\n"; // 输出1
  it += 3; // 跳跃到第四个元素的迭代器
  std::cout << *it << "\n"; // 输出4
  it = it - 2; // 跳跃到第二个元素的迭代器
  std::cout << *it << "\n"; // 输出2
  std::cout << it[2] << "\n"; // 输出4,相当于*(it + 2)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值