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
中,resize
和reserve
是两个用于处理动态数组的方法,它们的区别在于它们的目标和行为不同。
resize
:此方法用于改变vector
的大小。如果你将vector
的大小设为新的大小,那么vector
中超出新大小的部分会被删除,而小于新大小的部分会被添加空值(对于基本类型)或默认构造的对象(对于类类型)。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中仍然没有元素