C++如何提高Vector效率的一些方法

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,二者区别可以去网上查),否则会导致程序崩溃。

由于临时遇到才写的这个,比较赶时间,因此这里暂时不对原因进行过多分析,以后有时间再进行补充。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
为了提高C++ vector的性能,可以采取以下几种方法: 1. 避免在vector前部插入元素:向vector前部插入元素会导致后续元素的重新分配和移动,这是一种效率较低的操作。相反,可以考虑使用push_back()函数将新元素添加到vector的末尾,这样可以避免重新分配和移动元素的操作。 2. 使用下标进行遍历:使用下标访问vector的元素比使用迭代器更快。可以使用for循环并使用下标来遍历vector,而不是使用迭代器。 3. 使用赋值和insert()函数:当需要从一个vector中取出元素来填充另一个vector时,可以使用赋值运算符将整个vector赋值给目标vector,这样可以节省插入元素的时间。另外,可以使用insert()函数将一个vector的元素插入到另一个vector的末尾,这样可以避免重新分配和移动元素的操作。 综上所述,为了提高C++ vector的性能,可以避免在vector前部插入元素,使用下标进行遍历,并根据具体情况选择使用赋值和insert()函数来填充vector。这些方法可以有效地提高vector的性能。 [1 [2 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ vector 性能优化:](https://blog.csdn.net/ShellDawn/article/details/87906632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [6 个技巧,提升 C++11 的 vector 性能](https://blog.csdn.net/lxy_2011/article/details/122744130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值