面试题:在C++中,往vector插入1000000个数字,怎么做能保证性能较高?——阿里面试题

旅行   2024-10-18 07:56   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取
,免费分享。 欢迎V:fb964919126







C++中,往vector插入1000000个数字,怎么做能保证性能较高?





看到这个题目,我首先想到的就是提前配置好空间,因为vector是动态分配,提前配置好空间就不需要中途重新分配。让我们看看有哪些方法可以提高性能。


01

方法一:预先分配内存

写代码测试对比下:

#include <vector>#include <iostream>#include <chrono>
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电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章