网站是否开启gzip,番禺营销型网站建设,网站源码php,在线公司网站查询C整理集合C刷题基础知识#xff08;栈、队列、hash、STL、基础函数等#xff09;---持续更新-CSDN博客
vector的高级使用#xff08;优化#xff09;
1、元素插入#xff08;优化#xff09;
对于vector的元素插入存在两个函数push_back()以及emplace_back()#xff…C整理集合C刷题基础知识栈、队列、hash、STL、基础函数等---持续更新-CSDN博客
vector的高级使用优化
1、元素插入优化
对于vector的元素插入存在两个函数push_back()以及emplace_back()其都是向容器尾部插入元素但存在一些小的差异点
push_back()的机理1.构造一个临时对象——2.调用移动构造函数把临时对象的副本拷贝到容器末尾增加的元素中——3.调用析构释放临时对象。emplace_back()调用构造函数在容器末尾增加一个元素。
可以通过如下代码进行展示
#includeiostream
#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[])
{vectorMyTest 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::vectorint v;
v.resize(10); // v现在包含10个int类型的默认值通常是0std::vectorint v;
v.reserve(10); // v现在具有预先分配的内存可以容纳10个int类型的元素但v中仍然没有元素