栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 浅谈emplace_back及使用误区

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 浅谈emplace_back及使用误区

今天做c++ primer题目实现标准库vector,emplace_back忽然发现我对其了解甚少,首先,我在网上找到答案的代码,之前有过了解emplace_back是通过移动构造函数实现的,那么问题来了,如果我想实现vector b这样,我将其移动构造函数显式删除,那么

b.emplace_back(....),还能工作吗? 答案是 : 能

//base.h
#include
class base
{
public:
base() = default;
base(std::string t,int m):s(t),i(m){}
base(const base& b):s(b.s),i(b.i){}
base(base&&) = delete;
private:
std::string s;
int i;
};

这似乎符合我们的期望,可当我尝试使用自定义的版本(也就是网上那些"高手"的,还是外国人放在github的,呵呵啦,害我找这么久原因,不是坑吗?) 自定义版本如下:

template
template
void
Vec::emplace_back(Args&& ...args)
{
chk_n_alloc();
alloc.construct(first_free++, std::forward(args)...);
}

补充知识:C++11新特性,推荐使用emplace_back()替换push_back()的原因

c++11新加入了emplace_back()用来替换push_back():

在平时我们习惯性的尾插用push_back()去完成,但是如果是尾插临时对象的话,push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,而emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。

分析如下代码:

#include
using namespace std;
int i=0,j=0;
class A {
public:
  A(int i){
    str = to_string(i);
    cout << "构造函数" <<++i<< endl; 
  }
  ~A(){}
  A(const A& a): str(a.str){
    cout << "拷贝构造" <<++j<< endl;
  }
 
public:
  string str;
};
 
int main(){
  vector vec;
  vec.reserve(10);//开辟capacity
  for(int i=0;i<10;i++){
    vec.push_back(i); //调用了10次构造函数和10次拷贝构造函数,
//    vec.emplace_back(i); //调用了10次构造函数一次拷贝构造函数都没有调用过
  }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持考高分网。如有错误或未考虑完全的地方欢迎留言讨论,望不吝赐教。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/61128.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号