我是靠谱客的博主 拼搏发带,这篇文章主要介绍push_back和emplace_back区别1. 测试代码2. 分析,现在分享给大家,希望可以做个参考。

1. 测试代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream> #include <vector> using namespace std; class A { public: A(int i, int j) : i_(i), j_(j){ cout << "normal construct function" << endl; } A(const A& a) { cout << "copy construct function" << endl; } A(const A&& a) { cout << "move construct function" << endl; } private: int i_, j_; }; int main() { vector<A> v; v.reserve(20); cout << "create a object: " << endl; A a(1,2); cout << endl; cout << "v.push_back(a): " << endl; v.push_back(a); cout << endl; cout << "v.push_back(move(a)): " << endl; v.push_back(move(a)); cout << endl; cout << "v.emplace_back(2,3): " << endl; v.emplace_back(2,3); cout << endl; cout << "v.emplace_back(a): " << endl; v.emplace_back(a); cout << endl; cout << "v.emplace_back(move(a)): " << endl; v.emplace_back(move(a)); cout << endl; return 0; }

普通构造函数参数设置为2个,避免隐式构造 

结果如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create a object: normal construct function v.push_back(a): copy construct function v.push_back(move(a)): move construct function v.emplace_back(2,3): normal construct function v.emplace_back(a): copy construct function v.emplace_back(move(a)): move construct function

2. 分析

通过结果可以看到,push_back和emplace_back的区别主要是在最常见的用法上,也就是将一个元素压入vector的末尾,对于push_back来说由于需要先构造出对象(调用一次普通构造函数),然后调用push_back(调用一次拷贝构造函数),总共2次构造函数;

而emplace_back可以原地构造,也就是传入普通构造函数的参数即可,此时只需调用一次普通构造函数,所以新标准之后更加推荐使用emplace_back()

而对于其他用法,比如参数是一个左值对象或者是右值对象,行为是相同的,但是调用拷贝构造函数或者移动构造函数。

最后

以上就是拼搏发带最近收集整理的关于push_back和emplace_back区别1. 测试代码2. 分析的全部内容,更多相关push_back和emplace_back区别1.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部