STLpush 和 emplace区别
Posted joker D888
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STLpush 和 emplace区别相关的知识,希望对你有一定的参考价值。
【STL】push 和 emplace区别
相信大家都知道push的作用,对数据进行插入;
往常大家都是怎么用push的呢?
对于内置数据类型大家是不是这样:
这里以stack来举例
stack<int> s1;
s1.push(1);//直接插入数据
int a=2;
s1.push(a);//变量a插入,这两种操作对于内置数据类型都可以
那么如果插入的数据类型是自定义数据类型呢?
class Person
{
public:
int m_age;
string m_name;
};
stack<Person> s2;
//对于这种自定义数据类型还能进行如下的插入操作吗?
s2.push(18,"貂蝉");❌
//答案是否定的
//若想用push进行插入,只能先将这个对象构造出来,再将这个对象插入
Person p1(18,"西施");✅
s2.push(p1);
//或
s2.push(Person(19,"杨玉环"))//传入时构造对象
那么emplace就可以说就是对此“不足”的补充。
对于emplace,C++标准库的简要说明就是构造和插入元素,emplace可以直接传入构造对象需要的元素,然后自己调用其构造函数!
//那么对于上述错误的push操作就可以用emplace来完成
s2.emplace(20,"张三"); //传入20,"张三"后,它会自己调用一遍Person得构造函数
//此问题发现于,做题需要,需要插入二维数组横纵坐标,想要简单的用pair来进行插入,如
queue<pair<int,int>> q;
q.push(1,1);❌
//得先构造对象
q.push(make_pair<int,int>(0, 0));
//就是想要简单的传入横纵坐标即可,不想有多余的操作,如下,使用emplace
q.emplace(1,1);✅
大概可以理解为push能做的,emplace都能做。
push是得传入得对象先得造好,再复制过去插入;而emplace则可以自己拿到构造对象所需得元素构造出来,直接插入即可。
emplace相比于push省去了复制这步,即使用emplace这种操作会更节省内存。
🗣:
- emplace_back(type) 对应 push_back(type)
- emplace(i, type) 对应 insert(type, i)
- emplace_front(type) 对应 push_front()
对于stack和queue这两种数据结构,插入只能push进行尾插,所以只有emplace这一种操作;
如有错误或不足欢迎指出。
以上是关于STLpush 和 emplace区别的主要内容,如果未能解决你的问题,请参考以下文章
vector 使用push_back 和emplace_back的区别
学习 emplace_back() 和 push_back 的区别 emplace_back效率高
C++11中的emplace_back与push_back区别