第9.3章: 按下标插入与删除

English

概述

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章。

要点