C++如何提高Vector效率的一些方法
参考的博客网址:
《STL vector提高效率注意事项与技巧》 https://blog.csdn.net/hyqsong/article/details/50514625
《vector效率低怎么破?》 https://blog.csdn.net/wangshubo1989/article/details/52858523
《两个vector之间复制数据的效率比较试验》 https://blog.csdn.net/myruo/article/details/90238655
1.复制拷贝数据
两个vector拷贝复制数据的方法比较多,对一些常见的方法进行了一下性能测试实验,实验代码如下:
#include <iostream>
#include <ctime>
#include <algorithm>
using namespace std;
int main() {
int length = 2000000;
vector<string> vecSrc1, vecSrc2, vecSrc3, vecSrc4, vecSrc5;
vector<string> vecDes1, vecDes2, vecDes3, vecDes4, vecDes5(length);
for (int i = 0; i < length; i++)
{
vecSrc1.push_back("helloworld");
vecSrc2.push_back("helloworld");
vecSrc3.push_back("helloworld");
vecSrc4.push_back("helloworld");
vecSrc5.push_back("helloworld");
}
clock_t c0;
//方法1
c0=clock();
for (int i = 0; i < length; i++)
{
vecDes1.push_back(vecSrc1[i]);
}
clock_t c1=clock();
//方法2 assign
vecDes2.assign(vecSrc2.begin(),vecSrc2.end());
clock_t c2=clock();
//方法3 swap
vecSrc3.swap(vecDes3);
clock_t c3=clock();
//方法4 直接赋值
vecDes4=vecSrc4;
clock_t c4=clock();
//方法5 copy算法
//vecDes5.resize(vecSrc5.size());
copy(vecSrc5.begin(),vecSrc5.end(),vecDes5.begin());
clock_t c5=clock();
cout << "t1 = " << c1 - c0 << "\nSrc size=" << vecSrc1.size() << " Dst size=" << vecDes1.size() << endl << endl;
cout << "t2 = " << c2 - c1 << "\nSrc size=" << vecSrc2.size() << " Dst size=" << vecDes2.size() << endl << endl;
cout << "t3 = " << c3 - c2 << "\nSrc size=" << vecSrc3.size() << " Dst size=" << vecDes3.size() << endl << endl;
cout << "t4 = " << c4 - c3 << "\nSrc size=" << vecSrc4.size() << " Dst size=" << vecDes4.size() << endl << endl;
cout << "t5 = " << c5 - c4 << "\nSrc size=" << vecSrc5.size() << " Dst size=" << vecDes5.size() << endl << endl;
return 0;
}
运行结果:
t1 = 301
Src size=2000000 Dst size=2000000
t2 = 181
Src size=2000000 Dst size=2000000
t3 = 0
Src size=0 Dst size=2000000
t4 = 182
Src size=2000000 Dst size=2000000
t5 = 22
Src size=2000000 Dst size=2000000
根据实验结果可以看到,效率从高到低分别是:
swap > copy > assign > 直接赋值 > push_back赋值
总结: 这里比较好的是swap和copy,但需要注意的是,swap是内存交换,这里经过swap后,src的内容会与dst发生交换。其次copy也不错,不过需要注意的是,swap需要提前分配好足够的内存,比如在声明是分配或者用resize分配(不能用reserve,二者区别可以去网上查),否则会导致程序崩溃。
由于临时遇到才写的这个,比较赶时间,因此这里暂时不对原因进行过多分析,以后有时间再进行补充。