第9.3章: 按下标插入与删除
概述
fast_io 容器提供 insert_index 和 erase_index 操作。它们是基于迭代器的插入与删除的带边界检查替代品。若下标越界,它们会调用 fast_terminate()。
1. insert_index
#include <fast_io_dsal/vector.h>
#include <fast_io.h>
int main() {
::fast_io::vector<::std::size_t> v{10zu, 20zu, 30zu, 40zu};
// Insert 25 at index 2 (between 20 and 30)
v.insert_index(2zu, 25zu);
// v is now {10zu, 20zu, 25zu, 30zu, 40zu}
// Out-of-range index terminates the program
v.insert_index(100zu, 99zu); // fast_terminate()
}
可用于:
| 容器 | 单个元素 | 多个副本 | 范围 |
|---|---|---|---|
vector |
insert_index(idx, val) |
— | — |
deque |
insert_index(idx, val) |
insert_index(idx, count, val) |
insert_range_index(idx, rg) |
bitvec |
insert_index(idx, bit) |
— | — |
2. erase_index
#include <fast_io_dsal/vector.h>
#include <fast_io.h>
int main() {
::fast_io::vector<::std::size_t> v{10zu, 20zu, 30zu, 40zu, 50zu};
// Erase element at index 2 (removes 30)
v.erase_index(2zu);
// v is now {10zu, 20zu, 40zu, 50zu}
// Erase range [first, last) — i.e. left_index=1 (inclusive) to right_index=3 (exclusive)
// Removes elements at index 1 and 2
v.erase_index(1zu, 3zu);
// v is now {10zu, 50zu}
}
可用于:
| 容器 | 单个元素 | 范围 [first, last) |
|---|---|---|
vector |
erase_index(idx) |
erase_index(first, last) |
deque |
erase_index(idx) |
erase_index(first, last) |
bitvec |
erase_index(idx) |
erase_index(first, last) |
注意:first 和 last 是下标,不是个数。范围 [first, last) 表示左下标包含、右下标不包含。例如 erase_index(1zu, 3zu) 删除的是下标 1 和下标 2 的元素(而不是从下标 1 开始的 3 个元素)。
建议:优先使用 insert_index / erase_index,而不是基于迭代器的操作。它们更好用、更不易误用,而且免费提供边界检查。
迭代器失效:与基于迭代器的对应操作一样,insert_index 和 erase_index 会使迭代器失效。对 vector 和 bitvec 来说,任何插入或删除都会使所有迭代器、指针和引用失效。对 deque 来说,迭代器总会失效,但指向未被删除元素的指针和引用在 push_front() 与 push_back() 之后仍然有效——详见第9.9章。
要点
insert_index(idx, val)在指定位置插入,并做边界检查。erase_index(idx)删除一个元素;erase_index(first, last)删除一个范围。- 可用于
vector、deque和bitvec。 - 下标越界时会调用
fast_terminate()。 - 为了安全,优先使用
_index系列操作而不是基于迭代器的插入/删除。 insert_index和erase_index会使迭代器失效。对deque来说,指向未被删除元素的指针和引用在尾部插入后仍然有效。