欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【STL】push 和 emplace区别

程序员文章站 2022-03-21 17:05:38
...

【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这一种操作;

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