C++ 浅谈emplace_back及使用误区
今天做c++ primer题目实现标准库vector,emplace_back忽然发现我对其了解甚少,首先,我在网上找到答案的代码,之前有过了解emplace_back是通过移动构造函数实现的,那么问题来了,如果我想实现vector
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
{
chk_n_alloc();
alloc.construct(first_free++, std::forward
}
补充知识: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次构造函数一次拷贝构造函数都没有调用过
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持无名。如有错误或未考虑完全的地方欢迎留言讨论,望不吝赐教。
同类资源
- win32 dll注入程序C++源码
易语言win32dll注入程序C++源码例子源代码,如果要看效果的话需要知道目标程序是64位还是32位。...
- C++显示调用易语言编写的DLL
C++显示调用易语言编写的DLL例子源代码,最近遇到一个案子使用C++调用易编写的DLL,其中遇到调用问题,特发此贴...
- 易语言与易语言调用C++,dll测试
易语言与易语言调用C++,dll测试例子源代码,测试结果调用C++写的DLL函数比易语言快4倍,测试结果不具有专业性,...
- C++禁用及启用笔记本键盘工具
C++禁用及启用笔记本键盘工具绿色版,已经重新打包工具,可以重新下载工具了。...
- C++实现LR(1)语法分析器
C++实现LR(1)语法分析器本文件感兴趣的可以参考一下,学校老师布置的作业,编译原理实验LR(1)语法分析器。...
- libstdc++.so.6.10在ARM运行上的
libstdc++.so.6.10在ARM运行上的本文件感兴趣的可以参考一下,运行在ARM上的libstdc++.so.6.10。...
- 面向对象编程C++和Java比较教程
面向对象编程C++和Java比较教程本文件感兴趣的可以参考一下,面向对象编程C++和Java比较教程中英文完整版pd...
- Qt C++时间序列分析代码
QtC++时间序列分析代码本文件感兴趣的可以参考一下,该代码是用于vs,作为时间序列分析的。...
- c++写的编译器,有词法分析,语义分析以及目标代码生成
c++写的编译器,有词法分析,语义分析以及目标代码生成本文件感兴趣的可以参考一下,基于c++编写的编译程序。...
- C++ TCP-socket端口通讯server+client
C++TCP-socket端口通讯server+client本文件感兴趣的可以参考一下,用C++编写的关于TCP-socket端口通讯的实...
- Frechet distance算法C++
Frechetdistance算法C++本文件感兴趣的可以参考一下,离散FRECHET距离FrechetdistanceC++代码。...
- 操作系统C++页面置换算法实验报告,有opt,LRU,先进先出,时钟算法
操作系统C++页面置换算法实验报告,有opt,LRU,先进先出,时钟算法本文件感兴趣的可以参考一下,函数随机产生页面...