C++之vector插入初始化性能优化

C++整理集合C++刷题基础知识(栈、队列、hash、STL、基础函数等)---持续更新-CSDN博客

vector的高级使用(优化)

1、元素插入(优化)

对于vector的元素插入存在两个函数push_back()以及emplace_back(),其都是向容器尾部插入元素,但存在一些小的差异点:

  • push_back()的机理:1.构造一个临时对象——2.调用移动构造函数把临时对象的副本拷贝到容器末尾增加的元素中——3.调用析构释放临时对象。
  • emplace_back()调用构造函数在容器末尾增加一个元素。

可以通过如下代码进行展示:

#include<iostream>
#include <vector>
using namespace std;

class MyTest
{
public:
    //普通构造
    MyTest(int id,int age):m_id(id),m_age(age)
    { 
        cout << "创建" << this << endl;
    }
    //拷贝构造
    MyTest(const MyTest &t):m_id(t.m_id),m_age(t.m_age)
    {  
        cout << "拷贝" << this << endl;
    }
    //移动构造
    MyTest(const MyTest &&t)
    {
        m_id = std::move(t.m_id);
        m_age = std::move(t.m_age);
        cout << "移动" << this << endl;
    }
    //析构
    ~MyTest()
    {
        cout << "析构" << this << endl;
    }
private:
    int m_id; //id成员
    int m_age;//age成员
};

int main(int argc, char *argv[])
{
    vector<MyTest> vec(10);
    cout << "\n ------ push_back --------" << endl;
    vec.push_back(MyTest(1,20));
    cout << "\n ------ emplace_back --------" << endl;
    vec.emplace_back(1,20);
    cout << "\n -------- finish -------- " << endl;
}

通过编译可以得到如下结果:

 ------ push_back --------
创建
移动
析构

 ------ emplace_back --------
创建

 -------- finish --------
析构
析构

因此emplace_back()的效率要比push_back()高得多,在处理大数据量的问题时效果更加明显。

2、 容器大小声明(内存初始化)

在C++的std::vector中,resizereserve是两个用于处理动态数组的方法,它们的区别在于它们的目标和行为不同。

  1. resize:此方法用于改变vector的大小。如果你将vector的大小设为新的大小,那么vector中超出新大小的部分会被删除,而小于新大小的部分会被添加空值(对于基本类型)或默认构造的对象(对于类类型)。
  2. reserve:此方法用于改变vector的容量。reserve方法会预先分配足够的内存以容纳新的元素,但并不会构造这些元素。如果分配的容量大于当前的需求,那么多余的内存将被闲置,不会进行任何初始化。
std::vector<int> v;  
v.resize(10);  // v现在包含10个int类型的默认值(通常是0)


std::vector<int> v;  
v.reserve(10);  // v现在具有预先分配的内存,可以容纳10个int类型的元素,但v中仍然没有元素

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值