组别:提高级
难度: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; } |
[]
运算符访问元素,并且支持所有迭代器操作(如 ++
, --
, +
, -
)。还可以用<、>、<=、>=、==、!=运算符进行比较++
和 --
运算符。支持部分比较运算符==、!=++
运算符。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; } |