第9.5章: 非检查操作
概述
每个带检查的操作都有一个对应的 _unchecked 变体,它跳过边界检查。只有在你已经确认下标或条件有效时才使用它们。对非检查操作传入无效参数是未定义行为。
1. 非检查操作对照表
| 带检查(安全) | 非检查(更快) | 适用于 |
|---|---|---|
operator[](idx) |
index_unchecked(idx) |
vector、deque、array、span、index_span、string_view |
front() |
front_unchecked() |
所有拥有所有权的容器、span、string_view |
back() |
back_unchecked() |
除 forward_list 之外的所有容器 |
pop_back() |
pop_back_unchecked() |
vector、deque、list、bitvec |
pop_front() |
pop_front_unchecked() |
deque、list、forward_list |
push_back() |
push_back_unchecked() |
vector、bitvec |
emplace_back() |
emplace_back_unchecked() |
vector |
2. 示例:reserve + push_back_unchecked
#include <fast_io_dsal/vector.h>
#include <fast_io.h>
int main() {
::fast_io::vector<::std::size_t> v;
v.reserve(100zu); // Pre-allocate space for 100 elements
// Safe: push_back checks capacity and may reallocate
v.push_back(42zu);
// Fast: assumes capacity is available (we just reserved 100)
for (::std::size_t i{}; i < 50zu; ++i) {
v.push_back_unchecked(i); // No capacity check
}
}
提示:当你已知最终大小时,在紧凑的循环中使用
reserve() + push_back_unchecked()。这样可以避免反复检查容量,明显快于在循环里调用 push_back()。
要点
- 每个带检查的操作都有对应的
_unchecked版本。 - 非检查操作跳过边界/容量检查 — 输入无效时是未定义行为。
- 批量插入时用
reserve()+push_back_unchecked()更快。 - 只有在你能够证明前置条件成立时才使用非检查操作。