文章目录
- 测试代码:emplace_back()少一次复制操作,所以效率更高
- emplace_back()无法替代push_back()的例子
测试代码:emplace_back()少一次复制操作,所以效率更高 这俩代码都是别的网友写的,我看到觉得很棒,搬移故来了
这个代码说明参数为左值引用的push_back方法要调用构造函数和复制构造函数,说明确实要先构造一个临时对象,再把临时对象用copy构造拷贝到数组最后面,确实费时。
#include
#include
#include
using namespace std;
class A {
public:
A(int i){
str = to_string(i);
cout << "构造函数" << endl;
}
~A(){}
A(const A& other): str(other.str){
cout << "拷贝构造" << endl;
}
public:
string str;
};
int main()
{
vector vec;
vec.reserve(10);
for(int i=0;
i<10;
i++){
vec.push_back(A(i));
//调用了10次构造函数和10次拷贝构造函数,
//vec.emplace_back(i);
//调用了10次构造函数一次拷贝构造函数都没有调用过
}
}
下面这个代码详细分析了五种原型,左值参数的,右值参数的push_back,以及emplace_back。发现:
- 左值参数的push_back要调用构造函数和复制构造
- 右值参数的push_back要调用构造函数和移动构造
- emplace_back要调用一次构造而已
#include
#include
#include "time_interval.h"class Foo {
public:
Foo(std::string str) : name(str) {
std::cout << "constructor" << std::endl;
}
Foo(const Foo& f) : name(f.name) {
std::cout << "copy constructor" << std::endl;
}
Foo(Foo&& f) : name(std::move(f.name)){
std::cout << "move constructor" << std::endl;
}private:
std::string name;
};
int main() {std::vector v;
int count = 10000000;
v.reserve(count);
//预分配十万大小,排除掉分配内存的时间{
TIME_INTERVAL_SCOPE("push_back T:");
Foo temp("ceshi");
v.push_back(temp);
// push_back(const T&),参数是左值引用
//打印结果:
//constructor
//copy constructor
}v.clear();
{
TIME_INTERVAL_SCOPE("push_back move(T):");
Foo temp("ceshi");
v.push_back(std::move(temp));
// push_back(T &&), 参数是右值引用
//打印结果:
//constructor
//move constructor
}v.clear();
{
TIME_INTERVAL_SCOPE("push_back(T&&):");
v.push_back(Foo("ceshi"));
// push_back(T &&), 参数是右值引用
//打印结果:
//constructor
//move constructor
}v.clear();
{
std::string temp = "ceshi";
TIME_INTERVAL_SCOPE("push_back(string):");
v.push_back(temp);
// push_back(T &&), 参数是右值引用
//打印结果:
//constructor
//move constructor
}v.clear();
{
std::string temp = "ceshi";
TIME_INTERVAL_SCOPE("emplace_back(string):");
v.emplace_back(temp);
// 只有一次构造函数,不调用拷贝构造函数,速度最快
//打印结果:
//constructor
}
}
emplace_back()无法替代push_back()的例子 【emplace_back()和push_back()的对比,前者不能替代后者的例子】
文章图片
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题