push与emplace的异同?
一、定义
emplace 是C++11 才推出的,同时还有swap。
所以兼容性问题还得是push
void push (const value_type& val);
void push (value_type&& val);
template <class... Args> void emplace (Args&&... args);
再看看对其的解释
stack::push
Insert element //插入元素
stack::emplace
Construct and insert element //构造并插入元素
可以看出来emplace是有构造的过程,所以可以省去自己构造的过程。
详见下面代码。
1.调用关系
不同的容器实现方式不一样,具体emplace 的实现过程也不同。
stack :
emplace调用了底层容器deque的emplace_back
push调用了底层容器deque的push_back
而底层的deque都是实现了push_back
而对于vector:
push_back 调用了emplace_back;emplace调用了emplace_back;
二、测试
1.实例
代码如下(示例):
class data_t {
public:
int a;
int b;
public:
data_t(int x, int y) :a(x), b(y) {}
};
void main()
{
stack<data_t> tempp;
tempp.push(data_t(1, 2));
tempp.emplace(data_t(3, 4));
tempp.emplace(5, 6); //可以不用自己构造直接传参。
tempp.push(1, 2);//不可以不用自己构造直接传参。编译出错。
while (!tempp.empty())
{
std::cout << tempp.top().a << '\n';
tempp.pop();
}
}
可以看出直接
tempp.push(1, 2);
会编译出错,因为push不会自己构造。
参考:
http://www.cplusplus.com/reference/stack/stack/emplace/
https://blog.youkuaiyun.com/Kprogram/article/details/82055673