一、STL 简介
1.1 什么是 STL
STL(Standard Template Library,标准模板库)是 C++ 标准库的核心组成部分,它不仅提供了可复用的组件库,更是一个集成了高效数据结构与算法的软件框架。
1.2 STL 的六大组件
由于历史原因,string 类型先于 STL 出现,STL 后来由惠普实验室开发并开源,因此人们通常不将 string 归入 STL 范畴。

二、迭代器
迭代器(Iterator)是 C++ STL 中最精妙的设计之一,如果把 STL 的容器比作各种不同类型的仓库(数组、链表、树),那么迭代器就是一把万能钥匙,它让你不用关心仓库内部的具体构造,就能以统一的方式访问里面的每一个货物。
2.1 迭代器的本质:泛化的指针
迭代器的行为在视觉和操作上都非常像普通的 C 语言指针,你可以对它进行解引用(获取数据)和移动(指向下一个数据)。
例如:vector<int>::iterator it
注:这里的 iterator 是通过内置类型(一般来说是指针)进行 typedef 重命名,即泛化后的产物。
迭代器的一般操作如下所示:
*it(解引用):获取迭代器当前指向的元素的值。++it或it++(递增):让迭代器移动到容器中的下一个元素。==和!=(比较):判断两个迭代器是否指向同一个位置。
温馨提示:对于迭代器,我们可以初步简单认为其是一个高级版本的指针。
2.2 核心区间的概念:左闭右开
一般而言有如下两个函数返回特定位置的迭代器:
begin():返回指向容器中第一个元素的迭代器。end():返回指向容器中最后一个元素之后位置的迭代器,它不指向任何实际存在的元素,可以理解为一个'越界哨兵'。
因此,在 C++ 中,容器和算法使用迭代器时都严格遵循左闭右开区间这一基本原则,即 [begin, end)。
注意:
A. 这种设计有一个巨大的好处:当 begin() == end() 时,可以直接用来判断容器是否为空。
B. end() - begin() 的大小即为容器中的元素个数。
2.3 代码演示:如何使用迭代器
我们以一个简单的 vector 为例,看看最经典的迭代器遍历方式:
#include <iostream>
#include <vector>
using namespace std;
int main() {
// vector 容器 可以简单理解为是一个顺序表
vector<> numbers = {, , , , };
vector<>::iterator it = numbers.();
(it != numbers.()) {
cout << *it << ;
++it;
}
;
}




