目录

STL-begin,end-end最后一个元素的后一个哨兵

STL [begin,end) | end()最后一个元素的后一个(哨兵)


https://i-blog.csdnimg.cn/direct/ca65faf956184078888fb08cff341559.png

在 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()

指向容器最后一个 有效元素的下一个位置

(类似于哨兵位) ,而非最后一个元素本身。例如:

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() 指向最后一个元素的 后 一个」,实际指向尾部哨兵位