stl之emplace函数的使用
函数 STL 使用
2023-09-14 09:13:36 时间
- c++11新标准引入了三个新成员-------emplace_front,emplace和emplace_back,这些操作构造而不是拷贝元素,因此相比push_back等函数能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。
- 这些操作分别对应push_front,insert和push_back,能够让我们把元素放置在容器头部,一个指定位置之前或容器尾部
用法:
c.emplace_back(t)在c的尾部创建一个值为t的元素
c.emplace_front(t)在c的头部创建一个值为t的元素
c.emplace(p,t)在迭代器p所指向的元素之前创建一个值为t的元素,返回指定新添加元素的迭代器
empalce的特性:
- 当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。
- 而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。
- emplace成员使用这些参数在容器管理的内存空间中直接构造元素。
代码演示:
#include<iostream>
#include<vector>
using namespace std;
class p
{
public:
p() { num = 100; age = 18; name = "无名氏"; }
p(int n,int a,string name) :num(n),age(a),name(name) {};
int num;
int age;
string name;
};
void test()
{
vector<p> v;
//使用三个参数的p的构造函数
v.emplace_back(520, 19, "大忽悠");
p p1;
//使用拷贝构造函数(浅拷贝)
v.emplace_back(p1);
//使用push_back
v.push_back(p1);//正确
//v.push_back(520, 19, "大忽悠");//错误,没有接收三个参数的push_back版本
//对与push_back的正确做法
v.push_back(p(520, 19, "大忽悠"));//创建一个临时的p对象传递给push_back
}
int main()
{
test();
system("pause");
return 0;
}
- 其中对第一个emplace_back的调用和第二个push_back调用都会创建新的p对象。
- 在调用第一个emplace_back时,会在容器管理的内存空间中直接创建对象。
- 而调用第二个push_back则会创建一个局部临时对象,并不会将其压入容器中。
emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配:
#include<iostream>
#include<vector>
using namespace std;
class p
{
public:
p() { num = 100; age = 18; name = "无名氏"; }
p(int n,int a,string name) :num(n),age(a),name(name) {};
p(int n) :num(n){}
int num;
int age;
string name;
};
void test()
{
vector<p> v;
//使用p的默认构造函数
v.emplace_back();
//使用p的有参构造--含三个参数
v.emplace_back(520, 18, "哈哈哈");
//使用p的有参构造---含一个参数
v.emplace_back(520);
}
int main()
{
test();
system("pause");
return 0;
}
总结:
emplace函数在容器中直接构造元素。传递给emplace函数的参数必须与元素类型的构造函数相匹配
相关文章
- 应用date函数读取系统当前时间_获取系统时间的代码
- 线性回归目标函数—–最小二乘法推导过程「建议收藏」
- STL源码剖析_stl编程指令详解
- C语言fscanf和fprintf函数的用法详解
- python中的if语句怎么用_iserror函数的使用方法
- P1706 全排列问题【STL 全排列函数】
- C++ map(STL map)删除元素(erase函数删除元素)详解
- 利用Oracle的乘法函数计算乘积(oracle乘法函数)
- 使用Oracle的SUBSTR函数实现字符串截取(oracle的截取字符串)
- 下的应用STL在Linux下的应用:利用精彩技术推动发展(stl在linux)
- MySQL中的CAST函数简介(mysql中cast意思)
- 对比STL与Redis哪种效率更高(stl与redis效率)
- Oracle中分段函数的应用实现(oracle中分段函数)
- javascript中的有名函数和无名函数
- asp下利用fso实现文件夹或文件移动改名等操作函数
- javascript最常用的10个自定义函数[推荐]
- Asp返回引用类型函数代码
- js当一个变量为函数时应该注意的一点细节小结
- 浅析stl序列容器(map和set)的仿函数排序