insert插入单个元素只需两个参数:位置迭代器和值;第三个参数仅用于批量插入相同值,如v.insert(v.begin()+2,42)。

insert在vector里插入单个元素要传三个参数?
不是。常见误解是以为 insert 必须带迭代器、值、数量,其实插入单个元素只用两个参数:位置迭代器 + 要插入的值。第三个参数仅用于批量插入相同值。
比如想在索引 2 处插入 42:
std::vector<int> v = {1, 2, 3, 4};
v.insert(v.begin() + 2, 42); // 插入后:{1, 2, 42, 3, 4}</int>
-
v.begin() + n是最安全的定位方式,n必须在[0, v.size()]范围内(允许插到末尾) - 别用
v.at(n)或v[n]得到迭代器——它们返回的是引用,不是迭代器 - 如果位置超出范围(如
v.begin() + 10且 size 只有 3),行为未定义,通常 crash
insert后原有迭代器和引用还有效吗?
不一定。vector 插入可能触发内存重分配,一旦发生,所有指向该 vector 的迭代器、指针、引用全部失效。
是否重分配取决于容量(v.capacity())是否足够:
- 若
v.size() ,插入不 realloc,仅移动后续元素,只有“插入点及之后”的迭代器失效 - 若
v.size() == v.capacity(),insert 会先扩容(通常是 1.5× 或 2×),此时所有迭代器/引用全部失效 - 想避免失效?提前用
v.reserve(N)预留足够空间
用insert插入多个相同元素怎么写?
靠重载版本:接受迭代器位置 + 数量 + 值。注意参数顺序不能错。
v.insert(v.begin() + 1, 3, 99); // 在索引1处插入3个99 → {1, 99, 99, 99, 2, 42, 3, 4}
- 第二个参数是 数量(size_t 类型),不是值;第三个才是值
- 误写成
v.insert(it, val, count)会编译失败或调用错误重载(比如当成插入区间) - 若要插入一个容器的全部内容,用区间版本:
v.insert(it, other_v.begin(), other_v.end())
性能上,insert比push_back慢多少?
慢不止一点。push_back 平均 O(1),insert 在中间位置是 O(n),因为得把插入点之后所有元素往后挪。
- 插入末尾等价于 push_back,但写
v.insert(v.end(), x)语义清晰,性能一样 - 频繁在头部或中部 insert,考虑换用
std::list或std::deque(后者支持高效首尾插入,中部仍慢) - 真要批量插入?先用
reserve,再用insert区间版本,比循环单次 insert 快得多
最易被忽略的是:insert 返回新插入元素的迭代器,但很多人直接丢弃它——其实它能帮你链式操作或避免重复计算位置。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











