[ S T L ] push与emplace?push_back与emplace_back?相互是怎么调用的?

4 篇文章 0 订阅
本文详细介绍了C++中stack的push和emplace函数的异同。emplace是C++11引入的新特性,可以直接在容器中构造对象,而push则需要先构造对象再插入。在测试示例中,emplace可以直接接受参数构造对象,而push则需要已构造的对象。对于不同的容器,如deque和vector,emplace通常会调用底层的emplace_back实现。
摘要由CSDN通过智能技术生成


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.csdn.net/Kprogram/article/details/82055673

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值