C++ 浅谈emplace_back及使用误区

 更新时间:2020年12月10日 15:49:51   作者:RGBMarco  
这篇文章主要介绍了C++ 浅谈emplace_back及使用误区,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

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

//Base.h
#include<string>
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<typename T>
template<class ...Args>
void
Vec<T>::emplace_back(Args&& ...args)
{
chk_n_alloc();
alloc.construct(first_free++, std::forward<Args>(args)...);
}

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

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

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

分析如下代码:

#include<bits/stdc++.h>
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<A> vec;
  vec.reserve(10);//开辟capacity
  for(int i=0;i<10;i++){
    vec.push_back(i); //调用了10次构造函数和10次拷贝构造函数,
//    vec.emplace_back(i); //调用了10次构造函数一次拷贝构造函数都没有调用过
  }
}

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

相关文章

  • 深度揭秘C++面向对象编程中继承的核心概念

    深度揭秘C++面向对象编程中继承的核心概念

    我们知道C语言是面向过程的编程语言,C++在C语言的基础上进化出了面向对象的模型,而继承就是面向对象的重要属性,下面就让小编来和大家详细讲讲吧
    2023-07-07
  • QT实现多线程两种方式案例详解

    QT实现多线程两种方式案例详解

    这篇文章主要介绍了QT实现多线程两种方式案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 基于C语言实现扫雷小游戏

    基于C语言实现扫雷小游戏

    这篇文章主要为大家详细介绍了基于C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言预编译#define(预处理)

    C语言预编译#define(预处理)

    这篇文章主要介绍了C语言预编译#define(预处理),#define 机制包括了一个机制,允许把参数替换到文本中,这种实现通常称为宏或者宏定义,下文更多的相关资料介绍需要的小伙伴可以参考一下
    2022-04-04
  • C语言实现学生宿舍管理系统

    C语言实现学生宿舍管理系统

    这篇文章主要为大家详细介绍了C语言实现学生宿舍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C/C++中指针和引用之相关问题深入研究

    C/C++中指针和引用之相关问题深入研究

    从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值
    2013-10-10
  • c++编写简单的计算器程序

    c++编写简单的计算器程序

    用c++语言实现一个简单的计算器,新手作品,仅仅包括基本的加减乘除运算。希望能够给菜鸟们一些启发
    2016-05-05
  • C语言实现扫雷小游戏(扩展版可选择游戏难度)

    C语言实现扫雷小游戏(扩展版可选择游戏难度)

    游戏目标是找出所有没有地雷的方格,完成游戏;要是按了有地雷的方格,游戏失败;玩家可标记雷的位置,游戏以完成时间来评高低,并且用户可以选择游戏难度
    2019-10-10
  • C语言链表实现贪吃蛇小游戏

    C语言链表实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C语言链表贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 浅析C++中的多线程编程

    浅析C++中的多线程编程

    这篇文章主要为大家详细介绍了C++中的多线程编程,包括创建线程、同步线程、传递数据给线程以及异常处理等方面,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论