【STL】push 和 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这一种操作;

如有错误或不足欢迎指出。

  • 20
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值