【C++】C++11新特性:变参模板、完美转发和emplace
2023-09-27 14:25:56 时间
C++11新特性:变参模板、完美转发和emplace
【C++11】关于C++11新特性简介 一、关于C++11的简介 二、统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 3.1 auto 3.2 decltype 3.3 nullptr 四、范围for循环 五、C++11中STL的一些变化
使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建。
《C++Primer》:
新标准引入了三个是新成员——emplace、emplace_front和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应着,insert、push_front、push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。
当我们调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。
问题代码如下:
#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; }
将对应的学生对象直接放入容器中会调用拷贝构造函数,拷贝一份放入容器中,引起了性能问题。
用变参模板和完美转发来解决这个问题。
vectStu.emplace_back(20, "小花");
变参模板——就是()中的参数。与该类有参构造函数参数相同。
完美转法——用上面这个参数私底下去调用该类的构造函数,构造一个对象放入到容器中。
vectStu.emplace_back();//相当于push_back vectStu.emplace();//相当于insert
如果发现还会出现多次调用情况,那是因为先放入了一个元素,然后由于空间不够,又重新开辟了一块新的空间,并且将原来的数据拷贝了过来。
这就是为什么vector容器在中间插入、删除元素挺费时的原因。
补充:
不同容器相关用法有所不同 类似于 deque list中 还可以这样用 emplace_front(); 直接用emplace()——相当于insert
【C++11】关于C++11新特性简介 一、关于C++11的简介 二、统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 3.1 auto 3.2 decltype 3.3 nullptr 四、范围for循环 五、C++11中STL的一些变化
相关文章
- C++深入浅出(七)—— 模板进阶
- C/C++动态开辟数组【C++:new/delete(推荐):int *arr = new int[m];】【C++:vector】【C:malloc() & free()】
- iBinary C++STL模板库关联容器之map/multimap
- 【C++】模板总结
- C++:求1-N的和
- c/c++优秀博文
- C++定义构造函数必须使用初始化列表的场合
- c++数组遍历十种方式
- C/C++趣味程序设计百例(1~10)
- bits/stdc++.h
- 【C++】C&C++结构体内存对齐
- C++函数模板
- 【C++模板】模板实现通用的数组
- 用汇编的眼光看C++(之模板类)
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- c++模板类
- C++11 可变模板参数
- 取代typeid打印变量类型:是否可能在标准变量中打印变量的类型C++?/ Is it possible to print a variable‘s type in standard C++?
- 28.C++- 单例类模板(详解)
- c++编程和c在思想上最大的差别
- C++move函数-左值按右值处理并移交所有权
- 那些陌生的C++关键字
- C++习题:模板函数如何得知参数是智能指针还是裸指针
- Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法