【STL】push 和 emplace区别

【STL】push 和 emplace区别

相信大家都知道push的作用,对数据进行插入;

往常大家都是怎么用push的呢?

对于内置数据类型大家是不是这样:

这里以stack来举例
stack s1;
s1.push(1);//直接插入数据
int a=2;
s1.push(a);//变量a插入,这两种操作对于内置数据类型都可以

那么如果插入的数据类型是自定义数据类型呢?

class Person
{
 public:
    int m_age;
    string m_name; 
};
stack 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> q;
q.push(1,1);❌
//得先构造对象
q.push(make_pair(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这一种操作;

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

你可能感兴趣的:(C++,stl,数据结构)