欢迎关注本公众号,专注面试题拆解
分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取 ,免费分享。 欢迎V:fb964919126
C++中,往vector插入1000000个数字,怎么做能保证性能较高?
看到这个题目,我首先想到的就是提前配置好空间,因为vector是动态分配,提前配置好空间就不需要中途重新分配。让我们看看有哪些方法可以提高性能。
01
方法一:预先分配内存
写代码测试对比下:
int main() {
auto start_time = std::chrono::high_resolution_clock::now();
std::vector<int> vec;
// 预先分配内存
//vec.reserve(1000000);
for (int i = 0; i < 1000000; ++i) {
vec.push_back(i);
}
// 记录结束时间
auto end_time = std::chrono::high_resolution_clock::now();
// 计算所花费的时间
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
// 输出所花费的时间
std::cout << "Time taken: " << duration.count() << " microseconds" << std::endl;
return 0;
}
运行输出花费时间为:
把第9行代码注释放开后再运行:
有提升,但是提升并不是很多。
02
使用构造函数初始化
在构造函数中直接初始化向量,避免了后续的 push_back() 操作。
std::vector<int> vec(1000000); // 初始化一个大小为1000000的向量,默认值为0
// 填充向量
for (int i = 0; i < 1000000; ++i) {
vec[i] = i;
}
输出结果让人眼前一亮啊:从5位数直接提升到4位数。
下标赋值本质上是一个直接的内存访问操作,通常是一个 O(1) 常数时间操作。
03
方法3:使用 emplace_back()
emplace_back() 直接在向量尾部构造对象,避免了对象的拷贝或移动。这对于内置类型(如 int)并没有显著优势,但对于自定义类型或复杂类型可能会提高性能。
std::vector<int> vec;// (1000000); // 初始化一个大小为1000的向量,默认值为0
vec.reserve(1000000);
// 填充向量
for (int i = 0; i < 1000000; ++i) {
//vec[i] = i;
vec.emplace_back(i);
}
运行结果如下,对比预分配+push_back方法,有点提升,但是提升很小。
三种方法对比下来,使用方法2性能最高。
总结:
针对这道题目,采用先初始化然后下标法赋值是用时最少的方法。
end
CppPlayer
关注,回复【电子书】珍藏CPP电子书资料赠送
精彩文章合集
专题推荐