vector 末尾添加元素首选 push_back(),安全高效;emplace_back() 对非平凡类型更优;避免 insert() 中间插入 int。

直接存,不用转换,vector<int></int> 就是干这个的。
用 push_back() 最常用也最安全
绝大多数时候你只需要往末尾加一个 int,push_back() 是首选。它自动处理内存扩容,语义清晰,且不会越界。
- 常见错误:手写循环 +
operator[]赋值,但没调用resize()或reserve(),结果访问未分配内存 → 崩溃或未定义行为 - 正确做法:
vec.push_back(42),哪怕vec是空的也没问题 - 性能影响:均摊 O(1),个别扩容时是 O(n),但对普通使用完全无感
emplace_back() 能省一次拷贝(但 int 没差别)
emplace_back() 直接在 vector 末尾构造对象,避免临时对象和拷贝/移动。不过对 int 这种 trivial 类型,编译器基本都优化掉了,效果和 push_back() 一样。
- 使用场景:当你存的是自定义类、
string、pair等非 trivial 类型时,emplace_back(1, "hello")比push_back({1, "hello"})更高效 - 参数差异:
emplace_back()接可变参数,转发给元素类型的构造函数;push_back()接一个已存在的值或右值 - 容易踩的坑:误以为
emplace_back()总是更快 —— 对int完全没必要,还可能让代码更难读
别用 insert() 往中间插 int(除非真需要)
insert() 会把指定位置之后的所有元素往后挪,时间复杂度是 O(n)。对 int 来说,这不仅是性能浪费,还容易因下标算错导致越界。
立即学习“C++免费学习笔记(深入)”;
- 典型错误:
vec.insert(vec.begin() + i, x),但i > vec.size()→ 运行时崩溃(debug 模式下可能触发断言) - 正确前提:确保
i ;如果只是追加,就别碰 <code>insert() - 兼容性注意:某些老编译器(如 VS2013 以前)对
insert()的迭代器检查不严格,掩盖了 bug
真正要注意的不是“怎么存”,而是“什么时候该用什么方式”。比如初始化一批数据,vector<int> v = {1, 2, 3};</int> 比循环 push_back() 更简洁;而边算边存,就老老实实用 push_back()。别为了炫技去套 emplace_back() 或 insert(),尤其当类型是 int 的时候。









