front()和back()是最简洁安全的首尾元素访问方式,但必须确保vector非空,否则行为未定义;它们语义清晰、性能略优、对const vector有效,且比下标访问和迭代器方式更直接可靠。

用 front() 和 back() 直接取首尾元素
只要 vector 非空,front() 和 back() 就是最简洁、最安全的取法。它们不检查边界,但语义清晰,且比下标访问略快(省去一次 size() 检查开销)。
- 调用前必须确保
v.empty() == false,否则行为未定义(不是抛异常,是直接崩溃或读垃圾内存) -
front()等价于v[0],back()等价于v[v.size()-1],但更意图明确 - 对
const vector也有效,返回const T&
用下标 [0] 和 [size()-1] 的常见陷阱
很多人图方便直接写 v[0] 和 v[v.size()-1],但这里有两个坑:
-
v.size()返回的是size_t(无符号整型),当v为空时,v.size()-1会绕回成极大值(如18446744073709551615),再用它做下标就彻底越界 -
v[0]在空容器上同样未定义,不会自动报错,调试时很难发现 - 如果只读不改,建议统一用
front()/back();如果要取引用并修改,也优先用它们
安全访问的最小防护写法
生产代码里不能假设容器非空,最简健壮写法是加一层判断:
if (!v.empty()) {
auto first = v.front();
auto last = v.back();
// 使用 first / last
}
别用 try-catch——front() 和 back() 不抛异常;也别依赖 at(),它虽会抛 std::out_of_range,但性能开销更大,且对首尾这种固定位置没必要。
立即学习“C++免费学习笔记(深入)”;
迭代器方式:*v.begin() 和 *(--v.end())
理论上可行,但没必要:
-
*v.begin()等价于v.front(),可读性差一点 -
*(--v.end())看似优雅,但v.end()是尾后迭代器,递减前必须确保非空,且比v.back()多一次运算 - 对
empty()容器调用begin() == end(),此时--v.end()是未定义行为
除非你在泛型算法里统一用迭代器,否则首尾访问请坚持用 front() 和 back() —— 它们就是为这个场景设计的。


















