C++中vector预分配容量赋值与push_back插入,哪种效率更高?
两种C++ vector元素插入方法的速度对比及优化建议
速度对比
- 方式1更快:初始化vector时就一次性分配了能容纳n个元素的连续内存,后续直接通过下标赋值,全程没有内存扩容和元素拷贝/移动的额外开销。
- 方式2性能劣势:默认情况下vector初始容量很小,每次
push_back如果当前容量不足,会触发扩容操作——通常是将现有容量翻倍,然后把旧内存中的元素拷贝或移动到新内存里。n越大,扩容次数越多,额外的性能损耗就越明显。
更优实现方案
优化版push_back写法
如果偏好push_back的写法,可提前调用reserve(n)预分配足够容量,消除扩容开销,性能能追平方式1:
int n; cin>>n; vector<int> v; v.reserve(n); // 预分配n个元素的空间 for(int i = 0;i<n;i++){ int x; cin>>x; v.push_back(x); }
标准库批量读取写法
利用istream_iterator和copy_n实现批量读取,代码更简洁且性能优异:
#include <iterator> #include <vector> #include <iostream> int main() { int n; cin >> n; vector<int> v; v.reserve(n); std::copy_n(std::istream_iterator<int>(cin), n, std::back_inserter(v)); return 0; }
输入速度优化(通用技巧)
如果输入操作是整体性能的瓶颈,可关闭cin与C标准IO的同步,大幅提升读取速度:
std::ios::sync_with_stdio(false); std::cin.tie(nullptr);
这行代码对所有基于cin的读取方式都有效,能显著降低输入耗时。
内容的提问来源于stack exchange,提问作者Abdullah Ahmed
相关产品推荐
相关产品推荐

