当前位置: 首页 > news >正文

北京建站公司做网站价格专门找人做软件的网站

北京建站公司做网站价格,专门找人做软件的网站,河池建设银行招聘网站,闲鱼网站如何赚钱vector的emplace_back与push_back 文章目录vector的emplace_back与push_back前言1.区别总览2.push_back支持右值引用不支持传入多个构造参数总是会进行拷贝构造3.emplace_backemplace_back可以接受多个构造参数支持原地构造前言 在vector中#xff0c;通过push_back与emplace_…vector的emplace_back与push_back 文章目录vector的emplace_back与push_back前言1.区别总览2.push_back支持右值引用不支持传入多个构造参数总是会进行拷贝构造3.emplace_backemplace_back可以接受多个构造参数支持原地构造前言 在vector中通过push_back与emplace_back都可以向尾部添加元素用push_back也可以用emplace_back也可以只看最终造成的结果的话似乎没有什么不同。我们总是能听到有人说emplace_back比push_back要快但是快在哪里呢? 什么情况下都快吗? 我们一起来跟着例子看一下。 1.区别总览 push_backemplace_back是否支持右值引用支持支持是否一定会发生拷贝构造一定不一定是够支持直接传入多个构造参数支持一个构造参数支持多个构造参数是够支持原地构造不支持支持下面对这些特性分别进行分析 2.push_back 支持右值引用 印象中push_back是不支持右值引用的然而实际上push_back一样支持右值引用比如我们看push_back的源码 voidpush_back(value_type __x){ emplace_back(std::move(__x)); }templatetypename... _Args又或者我们通过代码测试一下 std::string s1 hello;vectorstd::string strVec;strVec.push_back(std::move(s1));couts1s1endl;cout strVec.size strVec.size()endl;cout strVec[0] strVec[0] endl;控制台输出 s1 strVec.size1 strVec[0]hellostd::move将s1从一个左值转化为一个右值引用传入到push_back作为参数push_back接收了该参数并调用了std::string的移动拷造函数将资源转移到了容器内。这里提到了一个概念叫移动构造函数下面会专门介绍这个概念。 不支持传入多个构造参数 如果只需要传入一个构造参数就能构造对象 那么可以直接在push_back传入这个构造参数完成对象的构造例如 class testClass{public:int m_a;int m_b;testClass(int a){m_a a;m_b 10;}testClass(int a, int b ){m_a a;m_b b;} };void testContruct(){vectortestClass list;list.push_back(1);coutlist.sizelist.size()endl;cout list[0].m_a list[0].m_a list[0].m_b list[0].m_b endl; }执行结果 list.size1 list[0].m_a1 list[0].m_b10在只需要一个参数就能构造的情况下push_back可以接受这个构造参数并调用相应构造方法进行构造。 如果构造时需要多个构造参数则只能手动构造一个临时对象否则编译出错例如 void testContruct(){//编译错误list.push_back(1,2); }需要这样写 void testContruct(){list.push_back(testClass(1,2));cout list.size list.size() endl;cout list[0].m_a list[0].m_a list[0].m_b list[0].m_b endl;s }程序输出 list.size1 list[0].m_a1 list[0].m_b2这里与emplace_back是不同的emplace_back可以接受多构造参数的情况下面会分析到。 总是会进行拷贝构造 这点怎么理解呢我们通过一个例子来感受一下 首先创建一个类实现其构造拷贝构造以及析构函数 class BaseClassTwoPara {public:BaseClassTwoPara(int a){m_a a;m_b 999;cout construct m_a m_b endl;}BaseClassTwoPara(int a, int b){m_a a;m_b b;cout construct m_a m_b endl;}BaseClassTwoPara(const BaseClassTwoPara rhs){m_a rhs.m_a;m_b rhs.m_b;cout copy construct m_a m_b endl;}~BaseClassTwoPara(){cout delete m_a m_b endl;}int m_a, m_b; };然后创建一个vector进行测试分4种情况 传入一个构造参数让push_back自己构造对象 void test_TwoPara_push_back_cp() {vectorBaseClassTwoPara vl;cout test_TwoPara_push_back_cpendl;vl.push_back(888); }控制台输出: construct 888 999 copy construct 888 999 delete 888 999 test_TwoPara_push_back_cp delete 888 999能看到emplace_back首先调用BaseClassTwoPara的构造函数构造一个临时对象然后调用拷贝构造函数将这个对象复制到容器中然后立马析构掉临时对象程序结束时析构掉容器内的对象。 所以传入一个参数时是会发生拷贝的 传入已经构造好的对象 向vl中传入一个已经构造好的对象观察输出 void test_TwoPara_push_back_cp() {vectorBaseClassTwoPara vl;BaseClassTwoPara b1(1, 2);vl.push_back(b1);cout test_TwoPara_push_back_cp endl; }控制台输出 construct 1 2 copy construct 1 2 test_TwoPara_push_back_cp delete 1 2 delete 1 2这里的流程是b1首先调用两参数的构造函数构造出一个局部对象然后将这个对象作为push_back参数传入v1复制b1对象到容器内但是不会向上面那个例子那样把b1析构因为b1不是临时对象程序退出时b1以及vl内的对象被析构。 所以传入一个构造好的对象时push_back会发生拷贝。 传入一个临时对象 通过BaseClassTwoPara(1,2)构造一个临时对象传入push_back void test_TwoPara_push_back_cp() {vectorBaseClassTwoPara vl;vl.push_back(BaseClassTwoPara(1,2));cout test_TwoPara_push_back_cp endl; }控制台输出 construct 1 2 copy construct 1 2 delete 1 2 test_TwoPara_push_back_cp delete 1 2可以看到临时对象通过构造函数被创建后vl复制该临时对象然后析构临时对象程序结束时再析构容器内的对象类似于上面提到的传入一个构造参数让push_back自己构造对象这种情况。 所以传入一个临时对象push_back会发生拷贝。 传右值 传右值时会调用BaseClassTwoPara的移动构造函数其实也是一种拷贝形式这里会出现两种不同的情况 1当传入一个右值时v1首先调用普通构构造函数构造一个BaseClassTwoPara临时对象然后调用移动构造函数在容器内构造一个对象然后析构临时对象可以下面代码看出。 void test_TwoPara_push_back_cp() {vectorBaseClassTwoPara vl;vl.push_back(1);cout test_TwoPara_push_back_cp endl; } 控制台输出 construct 1 999 move copy construct 1 999 delete 0 0 test_TwoPara_push_back_cp delete 1 9992当传入一个右值引用时直接调用移动构造函数在容器中创建对象 void test_TwoPara_push_back_cp() {vectorBaseClassTwoPara vl;BaseClassTwoPara b1(1, 2);vl.push_back(std::move(b1))cout test_TwoPara_push_back_cp endl; }construct 1 2 move copy construct 1 2 test_TwoPara_push_back_cp delete 0 0 delete 1 2所以不论什么情况push_back至少发生一次拷贝操作这里说的拷贝也把移动构造算进来了因为移动构造也是基于一个已有的对象来创建一个新的对象。 3.emplace_back emplace_back的大部分特性与push_back都是一样的这一小节只分析不同点。 两点不同 emplace_back可以接受多个构造参数 可以将多个构造参数传入emplace_back只要实现了对应的构造函数就可以完成构造例如 void test_TwoPara_push_back_cp() {vectorBaseClassTwoPara vl;vl.emplace_back(888,777);cout test_TwoPara_push_back_cpendl; }控制台输出 construct 888 777 test_TwoPara_push_back_cp delete 888 777也就是emplace_back这里直接调用了BaseClassTwoPara两参数的构造函数构造了一个BaseClassTwoPara对象而push_back只能支持一个。 支持原地构造 从上面这个测试的输出可以看出来如果直接输入构造参数emplace_back的表现与push_back完全不同emplace_back直接将对象构造在了容器内而不是构造一个临时的再拷贝到容器内这点如果利用好了可以大大提高性能。 以上就是emplace_back与push_back的异同点。
http://www.w-s-a.com/news/521787/

相关文章:

  • 商务网站的特点ui软件界面设计
  • 广州个性化网站开发网站索引量是什么意思
  • 公司网站制作专业公司python做后台网站的多吗
  • 桂林建站平台哪家好给别人做网站怎么收取费用
  • python做网站显示表格用visual做的网站
  • 彩票网站建设需要什么聊城网站建设首选天成网络
  • 安徽建设工程网站wordpress标签云代码
  • 推荐佛山顺德网站建设手机网站建设域名空间
  • 电子商务网站建设策划书例子企业官网用什么cms系统
  • 网站栏目设计怎么写平面设计接单报价表
  • 做网站美工要学什么网站推广的方法包括
  • 哪个网站可以做笔译兼职wordpress加表单
  • 百度站内搜索 wordpress微餐饮建站费用
  • 用什么做网站的访问量统计制作手工作品
  • 微信公众号搭建网站河南卫生基层系统网站建设
  • steam账号注册网站重庆手机版建站系统哪家好
  • 中新生态城建设局门户网站wordpress云盘视频播放
  • 大型网站开发基本流程wordpress记录用户搜索
  • 云服务器安装win系统做网站wordpress边栏扩大尺寸
  • 网站开发面试自我介绍软件下载网站如何建设
  • 可以做翻译任务的网站陕西省建设厅八大员证
  • 昆明 网站推广重庆网页优化seo公司
  • 网站排名下降怎么上去设计一套app页面多少钱
  • 专门用来查找网址的网站查公司名字是否被注册
  • 自己创建网站教程河南省建设厅官方网站李学军
  • 一个网站需要多少容量怎样免费设计网站建设
  • 建设工程交易中心网站12306的网站是哪个公司做的
  • 建设网站经营范围自己给公司做网站
  • 河北省住房建设厅政务网站网络营销推广的岗位职责有哪些
  • 上海网站建设优化价格孝义做网站的公司