Skip to content

迭代器

概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针

1.begin()和end()

begin()end()分别返回一个迭代器指针

  • begin()返回的指针指向容器的第一个元素
  • end()返回的指针指向容器的最后一个元素的后一位

begin()end()可以是容器对象的成员函数,也可以是全局函数

c++
// 假设v是一个容器
v.begin();
v.end();

begin(v);
end(v);

作为成员函数使用

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> v = { 1,2,3 };
	
	vector<int>::iterator start_it = v.begin();
	vector<int>::iterator end_it = v.end()-1;

	cout << *start_it << endl;		// 1
	cout << *end_it << endl;		// 3

	return 0;
}

作为全局函数使用

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> v = { 1,2,3 };
	
	vector<int>::iterator start_it = begin(v);
	vector<int>::iterator end_it = end(v)-1;

	cout << *start_it << endl;		// 1
	cout << *end_it << endl;		// 3

	return 0;
}

注意

end()返回的指针指向容器的最后一个元素的后一位,这么做是为了方便我们遍历容器

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> v = { 1,2,3 };
	
	for (vector<int>::iterator it = v.begin();it!= v.end();it++) {
		cout << *it<< endl;	
	}

	return 0;
}

2.迭代器类型

按照迭代器的功能强弱,可以把迭代器分为以下几种类型:

  • 输入迭代器 (input iterator)
  • 输出迭代器 (output iterator)
  • 前向迭代器 (forward iterator)
  • 双向迭代器 (bidirectional iterator)
  • 随机访问迭代器( random-access iterator)

2.1 迭代器的通用功能

以下是一些通用功能

  • 比较两个迭代器是否相等(==、!=)。
  • 前置和后置递增运算(++)。
  • 读取元素的解引用运算符(*)。只能读元素,也就是解引用只能出现在赋值运算符的右边。
  • 箭头运算符(->),解引用迭代器,并提取对象的成员。

2.2 输入迭代器

功能:

  • 通用的四种功能
  • 只能利用迭代器进行输入功能
  • 它只能用于单遍扫描算法

2.3 输出迭代器

功能:

  • 通用的四种功能
  • 只能利用迭代器进行输入功能
  • 只能用于单遍扫描算法

2.4 前向迭代器

功能:

  • 通用的四种功能
  • 能利用迭代器进行输入和输出功能
  • 能用于多遍扫描算法

2.5 双向迭代器

功能:

  • 通用的四种功能
  • 能利用迭代器进行输入和输出功能
  • 能用于多遍扫描算法
  • 前置和后置递减运算(- -),这意味这它能够双向访问

2.6 随机访问迭代器

功能:

  • 通用的四种功能
  • 能利用迭代器进行输入和输出功能
  • 前置和后置递减运算(- -)(意味着它是双向移动的)
  • 比较两个迭代器相对位置的关系运算符(<、<=、>、>=)
  • 支持和一个整数值的加减运算(+、+=、-、-=)
  • 两个迭代器上的减法运算符(-),得到两个迭代器的距离
  • 支持下标运算符(iter[n]),访问距离起始迭代器n个距离的迭代器指向的元素
  • 能用于多遍扫描算法。 在支持双向移动的基础上,支持前后位置的比较、随机存取、直接移动n个距离

总结

在这里插入图片描述

3.常用容器的迭代器

  • vector ——随机访问迭代器
  • deque——随机访问迭代器
  • list —— 双向迭代器
  • set / multiset——双向迭代器
  • map / multimap——双向迭代器
  • stack——不支持迭代器
  • queue——不支持迭代器

4.迭代器的辅助函数

STL 中有用于操作迭代器的三个函数模板,它们是:

  • advance(it, n);使迭代器 it 向前或向后移动 n 个元素。
  • distance(it1, it2);计算两个迭代器之间的距离,即迭代器 it1 经过多少次 + + 操作后和迭代器 it2相等。如果调用时 it1 已经指向 it2 的后面,则这个函数会陷入死循环。
  • iter_swap(it1, it2);用于交换两个迭代器 it1、it2 指向的值。

要使用上述模板,需要包含头文件

c++
#include<algorithm>

使用实例

c++
void text1()
{
    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    list<int> lst(a, a + 10);
    list<int>::iterator it1 = lst.begin();

    advance(it1, 2);  //it1向后移动两个元素,指向3
    cout << "当前it1指向的元素:" << *it1 << endl;  //输出3
    advance(it1, -1);  //it1向前移动一个元素,指向2
    cout << "当前it1指向的元素:" << *it1 << endl;  //输出2

    list<int>::iterator it2 = lst.end();
    it2--;  //it2指向最后一个元素的位置,即10的位置
    cout << "it1和it2的距离" << distance(it1, it2) << endl;  //输出8

    cout << "交换前打印:";
    for (it1 = begin(lst); it1 != end(lst); ++it1)
    {
        cout << *it1 << " ";
    }
    it1 = begin(lst);
    iter_swap(it1, it2); //交换 1 和 10
    cout << "\n交换后打印:";
    for (it1 = begin(lst); it1 != end(lst); ++it1)
    {
        cout << *it1 << " ";
    }
    cout << endl;
}

MIT Licensed