C++ STL中的 emplace

article/2025/11/11 1:50:34

英文释义(以前还真的很少用到这个单词,但是经常在键入empty()函数的时候冒出来):

emplace 
英 [ɪm'pleɪs]   美 [ɪm'pleɪs]  
v. 放列,安置,安放;

相对于insert、push、push_back系列先构造临时变量再复制到目标位置,emplace直接在目标位置上构造了。而且emplace支持“变参模板”,也就是说,如果它的实例类的构造函数有多个参数,emplace也支持对应个数的参数,而且对于显式构造函数,也能直接传参数。

比如这个类,接受一个int型的构造函数

class EmplaceClass {int num;
public:/*explicit */EmplaceClass(int x = 0) :num(x) { cout << "Constructed.\n"; }EmplaceClass(const EmplaceClass& from) :num(from.num) { cout << "Copied.\n"; }~EmplaceClass() {/* cout << "Destructed.\n"; */}
};

在主函数函数中调用时的测试,为了避免vector增长后会复制,所以分别各自的vector进行push_back和emplace_back

    vector<EmplaceClass> ecTest,pbTest;cout << "Now emplace one element:" << endl;ecTest.emplace_back(1);cout << "Now push back one element:" << endl;pbTest.push_back(1);

输出为

Now emplace one element:
Constructed.
Now push back one element:
Constructed.
Copied.

emplace操作少了一次复制

当构造函数为显示时

class EmplaceClass {int num;
public:explicit EmplaceClass(int x = 0) :num(x) { cout << "Constructed.\n"; }EmplaceClass(const EmplaceClass& from) :num(from.num) { cout << "Copied.\n"; }~EmplaceClass() {/* cout << "Destructed.\n"; */}
};

编译器就会报错

加入移动构造函数

class EmplaceClass {int num;string str;
public:/*explicit*/ EmplaceClass(int x = 0,string s="") :num(x) ,str(move(s)){ cout << "Constructed.\n"; }EmplaceClass(const EmplaceClass& from) :num(from.num),str(move(from.str)) { cout << "Copied.\n"; }EmplaceClass(EmplaceClass && from) :num(from.num), str(move(from.str)) { cout << "Moved.\n"; }~EmplaceClass() {/* cout << "Destructed.\n"; */}
};
    vector<EmplaceClass> ecTest,pbTest;cout << "Now emplace one element:" << endl;ecTest.emplace_back(1,"a");cout << "Now push back one element:" << endl;//EmplaceClass ec(1, "a");//pbTest.push_back(ec);//左值引用pbTest.push_back({ 1,"a"});//右值引用

输出为

Now emplace one element:
Constructed.
Now push back one element:
Constructed.
Moved.

其实看看C++17里面push_back函数的源码,就知道原因了:

void push_back(const _Ty& _Val){	// insert element at end, provide strong guaranteeemplace_back(_Val);}void push_back(_Ty&& _Val){	// insert by moving into element at end, provide strong guaranteeemplace_back(_STD move(_Val));}

相当于先构建一个左值或者右值引用_Val,再调用emplace_back。


http://chatgpt.dhexx.cn/article/BF08Zrf7.shtml

相关文章

stl之emplace函数的使用

c11新标准引入了三个新成员-------emplace_front,emplace和emplace_back,这些操作构造而不是拷贝元素&#xff0c;因此相比push_back等函数能更好地避免内存的拷贝与移动&#xff0c;使容器插入元素的性能得到进一步提升。这些操作分别对应push_front,insert和push_back&#x…

数字分解算法的优化

http://bbs.csdn.net/topics/90040267 以上是讨论的论坛 下面是一个算法&#xff1a; //数字为n&#xff0c;开始分解第k个数字void decompose(int n,int k){int i,j;//j用来表示数字是否分解完毕for(jn;j>1;j--){a[k]j;if(jn){for(int temp1;temp<k;temp)cout<<…

整数分解(java)

public class demo4 {public static void main(String[] args) {System.out.println("请输入一个数&#xff1a;");Scanner in new Scanner(System.in);int number in.nextInt();int result 0;do {int digit number % 10;result result * 10 digit;System.out.…

C语言程序——分解三位整数的各位数字

文章目录 前言一、分解三位整数二、程序实例1.程序代码2.运行结果3.结果分析 三、拓展应用总结 前言 程序设计中用到的整型数据和实际中的整数一样&#xff0c;也分为个位、十位和百位。 一、分解三位整数 取余运算可以得到数据的个位数。因此对于实际分解过程进行模拟&#…

Raptor-数字分解

1. 问题描述 之前写过一些 Raptor 的程序&#xff0c;里面经常会直接或间接遇到数字分解的要求。比如一个数 num 1234567&#xff0c;把这个数字逆序输出&#xff1b;判断一个数是否为水仙花数&#xff0c;1531^3 5^3 3^3&#xff0c;需要提取各位数字&#xff1b;或者 求一…

C++数字分解

数字分解 【问题描述】 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和&#xff0c;当n等于5时有6种拆分方法&#xff1a; 511111 51112 5113 5122 514 523输入&#xff1a;一行包含一个正整数n&#xff08;1<n<10&#xff09;。 输出&#xff1a;先将拆分…

整数分解方法

题目大意&#xff1a;给定一个整数n&#xff0c;找到k个数&#xff0c;使得其和等于n。 如&#xff1a; 41111 4112; 413; 422&#xff1b; 44&#xff1b; 求其分解的所有可能&#xff0c;并输出分解表达式。 解题思路&#xff1a;要拆分整数n&#xff0c;肯定先要找到一个…

史上最全的整数分解方法(包含经典的分苹果问题)

【华为OD机试真题 2022&2023】真题目录 点这里 【华为OD机试真题】信号发射和接收 &试读& 点这里 【华为OD机试真题】租车骑绿道 &试读& 点这里 整数分解方法总结 一、加法分解&#xff1a; 题目描述&#xff1a; 给定一个正整数&#xff0c;我们可以…

js输出1-100之间所有的质数并求总个数

代码如下&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-equiv"X-UA-Compa…

JavaScript输出杨辉三角形

JavaScript输出杨辉三角形 杨辉三角形的特点和规律代码如下&#xff1a;结果 杨辉三角形的特点和规律 起始行为第0行&#xff0c;第N行为N1个数从 N > 2行开始&#xff0c;每一行的数值&#xff08;不包含两边的数值&#xff09;都是上一行两个数字的相加。当 J1 或 JN1时&…

Vscode中JS输出乱码问题的解决

一直很好用vscode突然不好用了&#xff0c;原来输出正常的JS代码在输出中都是乱码。于是上网查答案&#xff0c;试了很多奇奇怪怪的答案&#xff0c;然而没有一款能够解决我这个问题。仔细琢磨&#xff0c;既然以前好用&#xff0c;现在不好用&#xff0c;应该是某个电脑操作“…

js输出九九乘法表

js输出九九乘法表 控制台输出 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

利用Javascript输出多个图片

利用Javascript输出多个图片 如果不利用Js输出图片的话&#xff0c;利用HTMLCSS输出多个图片非常麻烦的&#xff0c;工作量庞大。 建议遇到有必要多个输出的图片&#xff0c;使用js是最好的方法。 <script>var i;var arr["<img src./img/1.jpg>","…

js实现图形输出

1、矩形 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>//嵌套循环:外层循环一次&#xff0c;内层循环一轮//矩形for (var j 1; j < 5; j) {for (var i 1; …

用JS 输出 正三角形

效果图 以下是代码及 每行代码解释&#xff0c;仅供参考。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"view…

js 页面输出html,javascript中如何输出?

面对刚刚学习JavaScript的同学们&#xff0c;你是否知道JavaScript如何输出&#xff1f;下面本篇文章就来给大家介绍一下javascript的几种输出方式&#xff0c;希望对大家有所帮助。 JavaScript的输出方式&#xff1a; javascript 没有任何打印或输出的函数&#xff0c;可以通过…

js 向页面输出html,javascript怎么输出?

JavaScript怎么输出&#xff1f;输出方式有哪些&#xff1f;下面本篇文章就给大家介绍JavaScript的几种输出方式&#xff0c;希望对大家有所帮助。 方法1&#xff1a;使用window.alert()进行输出 window.alert()方法用于显示带有一条指定消息和一个【确认】 按钮的警告框。 代码…

JS 的三种输出方式

输出方式 第一种&#xff1a;alert&#xff08;&#xff09; alert() 语句&#xff1a;可以输出警告框。具有弹框效果 代码示例&#xff1a; <script type"text/javascript">alert(holle warold); </script> 效果图&#xff1a; 第二种&#xff1a;…

JavaScript的输出方式大全

helo&#xff01;小伙伴们&#xff0c;你们是不是和我一样学在学js过程中感觉这个知识不仅脑子&#xff0c;反而觉得相关的知识好多呀&#xff0c;网上的文章和视频也是&#xff0c;都不知道该怎么选了&#xff0c;没关系&#xff0c;我们慢慢来&#xff0c;这些知识点一点一点…

JS输出方式

一个程序编写完成之后&#xff0c;我们运行出的结果也有着不同的输出方式。 下面我主要介绍三种输出结果的方式&#xff1a;alert&#xff1b;console.log&#xff1b;document.write。 alert 这种输出方式是使用弹出框显示结果&#xff0c;但是只能一个一个的输出&#xff…