STL-begin,end-end最后一个元素的后一个哨兵
目录
STL [begin,end) | end()最后一个元素的后一个(哨兵)
在 C++ STL 中,
包前不包后
是指迭代器/指针范围采用
左闭右开
的数学区间表示方式
[begin, end)
,即包含起始位置但不包含结束位置。这与
arr.end()
的指针特性密切相关,具体可通过以下代码示例理解:
一、包前不包后的含义
假设我们有一个
vector<int> arr = {5,3,7,1};
:
sort(arr.begin(), arr.begin()+2); // 对前两个元素排序(索引 0~1)
此时排序范围是
arr[0]
和
arr[1]
,而
**arr.begin()+2
指向的
arr[2]
不参与排序,这就是 「包前不包后」 的体现。**
二、arr.end() 的指向
arr.end()
指向容器最后一个 有效元素的下一个位置
(类似于哨兵位) ,而非最后一个元素本身。例如:
vector<int> arr = {5,3,7,1};
auto it = arr.end(); // it 指向 arr[4](虚拟位置)
通过遍历可以验证:
for (auto p = arr.begin(); p != arr.end(); ++p) {
cout << *p << " "; // 输出 5 3 7 1
}
循环会在
p == arr.end()
时终止,因此不会访问越界内存。
三、代码示例:排序与反转
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> arr = {5,3,7,1};
vector<int> arr2 = {9,2,4};
// 整体交换
arr.swap(arr2); // 现在 arr={9,2,4}, arr2={5,3,7,1} [7]
// 排序(范围包前不包后)
sort(arr.begin(), arr.end()); // 排序后 arr={2,4,9}
for (auto x : arr) cout << x << " "; // 输出 2 4 9
// 反转(范围同样是[begin, end))
reverse(arr.begin(), arr.end()); // 反转后 arr={9,4,2}
return 0;
}
四、关键总结
概念 | 说明 |
包前不包后 | 操作区间为 [begin, end) ,确保不越界且逻辑统一 |
arr.end() 指向 | 容器末尾的「虚拟哨兵位」,用于标识循环终止条件 |
swap 操作 | 直接交换两个容器的内部数据指针,时间复杂度 O(1) |
注:「end() 指向最后一个元素的 后 一个」,实际指向尾部哨兵位