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

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

vector的高级使用(优化)

1、元素插入(优化)

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

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

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

#include
#include 
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 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 v;  
v.resize(10);  // v现在包含10个int类型的默认值(通常是0)


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

你可能感兴趣的:(每日一个C++基础系列,c++,开发语言)