类库与数据结构——迭代器
迭代器(Iterator)是C++标准模板库(STL)中的一种工具,用于在不暴露底层数据结构的前提下遍历容器。它类似于指针,可以指向容器中的元素,通过一系列操作访问和修改容器中的数据。
STL中的大部分容器(如vector
、list
、set
等)都提供迭代器,用来遍历其中的元素。每个容器的迭代器类型会有所不同,以满足不同的需求。
迭代器的类型
根据功能的不同,迭代器分为以下几种类型:
- 输入迭代器(Input Iterator):只能单向遍历元素,只能读取不能修改。
- 输出迭代器(Output Iterator):只能单向遍历元素,只能修改不能读取。
- 前向迭代器(Forward Iterator):可以单向遍历,可以读取和修改。
- 双向迭代器(Bidirectional Iterator):可以在容器中双向遍历。
- 随机访问迭代器(Random Access Iterator):可以双向遍历,可以随机访问任意位置元素。
vector
和deque
等连续存储结构支持此类型的迭代器。
常见容器的迭代器类型
vector
、deque
:随机访问迭代器list
:双向迭代器set
、map
:双向迭代器
迭代器的基本操作
下面是一些常用的迭代器操作:
-
获取迭代器
每个容器提供begin()
和end()
方法,分别返回指向容器起始位置和结束位置的迭代器。begin()
:指向第一个元素end()
:指向最后一个元素的下一个位置(不包含在容器中)
-
迭代器的递增和递减
++it
:将迭代器移动到下一个元素。--it
:将迭代器移动到前一个元素(仅双向或随机访问迭代器支持)。
-
解引用迭代器
*it
:访问迭代器所指向的元素。it->
:访问迭代器指向对象的成员(当元素是类或结构体时)。
-
迭代器的比较
- 可以使用
==
和!=
比较两个迭代器是否相等(是否指向同一位置)。
- 可以使用
迭代器的使用示例
以下是几个常见容器的迭代器操作示例:
1. vector
迭代器
vector
是动态数组,支持随机访问迭代器。
1 |
|
2. list
迭代器
list
是双向链表,支持双向迭代器。
1 |
|
3. map
迭代器
map
是关联容器,存储键值对,支持双向迭代器。
1 |
|
在map
中,it->first
访问键,it->second
访问值。
4. set
迭代器
set
是集合容器,支持双向迭代器,元素是唯一的且有序。
1 |
|
常见的迭代器操作实例
-
插入和删除操作(适用于
vector
和list
等可修改容器)-
插入操作:在指定位置插入元素
1
2
3
4std::vector<int> vec = {10, 20, 30};
auto it = vec.begin();
vec.insert(it + 1, 15); // 在第二个位置插入15
// vec: {10, 15, 20, 30} -
删除操作:删除指定位置元素
1
2
3
4
5std::list<int> lst = {10, 20, 30, 40};
auto it = lst.begin();
++it; // 指向20
lst.erase(it); // 删除20
// lst: {10, 30, 40}
-
-
查找和修改元素
-
查找元素的迭代器位置
1
2
3
4
5std::vector<int> vec = {10, 20, 30, 40};
auto it = std::find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
std::cout << "Found 30 at position " << std::distance(vec.begin(), it) << std::endl;
} -
修改元素
1
2
3
4std::vector<int> vec = {10, 20, 30, 40};
for (auto it = vec.begin(); it != vec.end(); ++it) {
*it *= 2; // 每个元素乘以2
}
-
-
反向迭代器
- 对于支持反向迭代的容器,可以使用
rbegin()
和rend()
获得反向迭代器。 - 示例:
1
2
3
4std::vector<int> vec = {10, 20, 30, 40};
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
std::cout << *it << " "; // 输出:40 30 20 10
}
- 对于支持反向迭代的容器,可以使用
总结
- 迭代器提供了灵活的接口,使得容器可以在不暴露底层实现的前提下进行遍历、插入、删除等操作。
- 常用迭代器操作包括:
begin()
、end()
、++
、--
、*
解引用等。 - 通过迭代器,可以更高效、简洁地对容器进行操作,使得代码独立于容器的具体实现。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 WinstonChen's Homepage!
评论