前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++11新特性:变参模板、完美转发和emplace

C++11新特性:变参模板、完美转发和emplace

作者头像
半生瓜的blog
发布2023-05-12 21:42:52
2680
发布2023-05-12 21:42:52
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog

C++11新特性:变参模板、完美转发和emplace

使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建。


《C++Primer》: 新标准引入了三个是新成员——emplace、emplace_front和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应着,insert、push_front、push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。

当我们调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。


问题代码如下

代码语言:javascript
复制
#include<iostream>
#include<vector>
#include<string>
#include<list>
using namespace std;
class Student
{
public:
	Student(int age, const char* name) :age(age), name(name)
	{
		cout << "有参构造函数被调用" << endl;
	}
	~Student()
	{
		cout << "析构函数被调用" << endl;
	}
	Student(const Student& other)
	{
		age = other.age;
		name = other.name;
		cout << "拷贝构造函数被调用" << endl;
	}
private:
	int age;
	string name;
};
int main(void)
{
	vector<Student> vectStu;
	//插入元素
	//1.先定义再插入
	//Student s1(18, "老王");
	//这样插入实际上是vector拷贝了一份s1放到了它自己里面,所以会执行一个有参构造和一个拷贝构造
	//vectStu.push_back(s1);
	
	//2.插入临时变量
	vectStu.push_back(Student(19, "老张"));//效果同上
	return 0;
}

将对应的学生对象直接放入容器中会调用拷贝构造函数,拷贝一份放入容器中,引起了性能问题

用变参模板和完美转发来解决这个问题。

代码语言:javascript
复制
vectStu.emplace_back(20, "小花");
在这里插入图片描述
在这里插入图片描述

变参模板——就是()中的参数。与该类有参构造函数参数相同。

完美转法——用上面这个参数私底下去调用该类的构造函数,构造一个对象放入到容器中。

代码语言:javascript
复制
vectStu.emplace_back();//相当于push_back
vectStu.emplace();//相当于insert

如果发现还会出现多次调用情况,那是因为先放入了一个元素,然后由于空间不够,又重新开辟了一块新的空间,并且将原来的数据拷贝了过来。

这就是为什么vector容器在中间插入、删除元素挺费时的原因。

补充:

代码语言:javascript
复制
不同容器相关用法有所不同
    类似于 deque list中
    还可以这样用
    emplace_front();
	...
    直接用emplace()——相当于insert
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++11新特性:变参模板、完美转发和emplace
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档