迭代器(iterators)

组别:提高级
难度:5

C++ 中的迭代器(iterators)是指针的通用化,允许在容器(如数组、向量、链表等)上进行遍历和操作。

例一:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/**************************************************************** 
 * Description: demonstrate the working of iterator, begin() and end() 
 * Author: Alex Li
 * Date: 2024-06-24 08:33:52
 * LastEditTime: 2024-06-24 08:36:11
****************************************************************/
#include<iostream> 
#include<iterator> 
#include<vector> 
using namespace std; 

int main() { 
	vector<int> ar = { 1, 2, 3, 4, 5 }; 
	
	vector<int>::iterator ptr;  //声明一个指向vector的iterator 
	cout << "The vector elements are : "; 
	for (ptr = ar.begin(); ptr < ar.end(); ptr++) 
		cout << *ptr << " "; 
	return 0;	 
} 

迭代器类型说明

  • 随机访问迭代器(Random Access Iterator):允许常数时间内对任意元素进行访问。这意味着你可以使用 [] 运算符访问元素,并且支持所有迭代器操作(如 ++, --, +, -)。还可以用<、>、<=、>=、==、!=运算符进行比较
  • 双向迭代器(Bidirectional Iterator):允许在容器中双向移动,但不能随机访问元素。可以使用 ++-- 运算符。支持部分比较运算符==、!=
  • 前向迭代器(Forward Iterator):只允许单向移动,但可以多次遍历容器。只支持 ++ 运算符。
  • 输入迭代器(Input Iterator):用于读取容器中的元素,只能单向移动。通常用于一次性遍历。
  • 输出迭代器(Output Iterator):用于写入容器中的元素,只能单向移动。通常用于一次性遍历。

迭代器的常用方法

  • begin(): 返回指向容器第一个元素的迭代器。
  • end(): 返回指向容器末尾的迭代器(末尾元素的下一个位置)。
  • rbegin(): 返回指向容器最后一个元素的逆向迭代器。
  • rend(): 返回指向容器第一个元素前面位置的逆向迭代器。
  • ++iter: 前向移动迭代器。
  • --iter: 后向移动迭代器(双向迭代器和随机访问迭代器)。
  • *iter: 解引用迭代器,访问元素。
  • iter->member: 通过迭代器访问元素成员。

常见容器及其对应的迭代器类型:

容器类型迭代器类型描述
vector随机访问迭代器支持随机访问、双向移动
array随机访问迭代器支持随机访问、双向移动
string随机访问迭代器支持随机访问、双向移动
deque随机访问迭代器支持随机访问、双向移动
list双向迭代器支持双向移动
set/multiset双向迭代器支持双向移动,元素有序
map/multimap双向迭代器支持双向移动,元素按键有序
unordered_set/unordered_multiset前向迭代器只支持单向移动,元素无序
unordered_map/unordered_multimap前向迭代器只支持单向移动,元素按键无序
stack不支持迭代器
queue不支持迭代器

双向迭代器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**************************************************************** 
 * Description: 双向迭代器
 * Author: Alex Li
 * Date: 2024-06-24 09:09:17
 * LastEditTime: 2024-06-24 10:06:33
****************************************************************/
#include <iostream>
#include <list>
#include <set>
#include <unordered_set>

void listExample() {
    std::list<int> lst = {1, 2, 3, 4, 5};
    for (auto it = lst.begin(); it != lst.end(); ++it) {  //不能用it <lst.end()
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void setExample() {
    std::set<int> s = {1, 2, 3, 4, 5};
    for (auto it = s.begin(); it != s.end(); ++it) {//不能用it <s.end()
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void unorderedSetExample() {
    std::unordered_set<int> us = {1, 2, 3, 4, 5};
    for (auto it = us.begin(); it != us.end(); ++it) {//不能用it <us.end()
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

int main() {
    listExample();
    setExample();
    unorderedSetExample();
    return 0;
}
Scroll to Top