C++优化之使用emplace、emplace_back

article/2025/11/11 0:36:15

        在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪费,如果可以在插入的时候直接构造,就只需要构造一次就够了。

push_back/insert 插入操作过程:
1. 有参构造
2. 拷贝构造
3. 析构

        C++11标准已经有这样的语法可以直接使用了,那就是emplace。vector有两个函数可以使用:emplace,emplace_back。emplace类似insert,emplace_back类似push_back。emplace的插入过程只调用了一次有参构造。

emplace 插入操作过程:
1. 有参构造
1、vectoremplace <->  insertemplace_back​  <-> ​push_back2、setemplcace <->  insert3、mapemplace <->  insert

通过示例代码可以更清晰的了解到他们的区别。

#include <iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<string>//Book结构,保存书本信息
struct SBook
{SBook() : bookName(""), price(0){std::cout << "default construct: " << bookName << std::endl;}SBook(std::string bookName_, int price_) : bookName(bookName_), price(price_){std::cout << "construct: " << bookName << std::endl;}SBook(SBook& rhs) : bookName(rhs.bookName), price(rhs.price){std::cout << "copy construct: " << bookName << std::endl;}~SBook(){std::cout << "deconstruct: " << bookName << std::endl;}bool operator <(const SBook& rhs) const{return bookName < rhs.bookName;}std::string bookName;int price;
};int main()
{//测试vectorstd::vector<SBook> books;// 预先分配,否则整个vector在容量不够的情况下重新分配内存books.reserve(100);std::cout << "test push_back:" << std::endl;books.push_back(SBook("C++从入门到放弃", 1));std::cout << std::endl;std::cout << "test emplace_back:" << std::endl;books.emplace_back("水浒传", 2);std::cout << std::endl;std::cout << "test emplace_back default:" << std::endl;books.emplace_back();auto& book = books.back();book.bookName = "红楼梦";book.price = 5;std::cout << std::endl;std::cout << "test emplace:" << std::endl;auto it = books.emplace(books.end());it->bookName = "西游记";it->price = 3;std::cout << std::endl;//std::cout << "output all books: " << std::endl;//for_each(books.begin(), books.end(), [](const SBook& book)->void//    {//        std::cout << book.bookName << std::endl;//    });//std::cout << std::endl; ​​​ // 测试setstd::set<SBook> bookSet;std::cout<< "test bookSet insert:" << std::endl;bookSet.insert(SBook("十万个为什么", 1));std::cout << std::endl;std::cout << "test bookSet emplace:" << std::endl;bookSet.emplace("新华字典", 2);std::cout << std::endl;//std::cout << "output bookset: " << std::endl;//for_each(bookSet.begin(), bookSet.end(), [](const SBook& book)->void//    {//        std::cout << book.bookName << std::endl;//    });//std::cout << std::endl;return 0;
}

vector:

set:

 


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

相关文章

emplace_back深度剖析

一&#xff0c;emplace_back和push_back 1&#xff0c;直接插入对象&#xff1a;emplace_back和push_back无区别 ①当传递已经存在的对象时&#xff0c;是无区别的 #include <iostream> #include <vector>using namespace std;/* C11 STL 容器 push/inser…

push_back和emplace_back区别

在使用vector容器时&#xff0c;往容器里添加元素时&#xff0c;有push_back和emplace_back两种方法&#xff0c;一般用得最多得是push_back&#xff0c;下面看看这两种方法得区别&#xff1a; push_back源码&#xff0c;有重载得左值和右值&#xff0c;关于左值和右值可以查看…

C++11之emplace_back

在之前的学习中&#xff0c;了解到在STL中&#xff0c;进行插入元素的时候&#xff0c;有insert和push两种选择方式&#xff0c;而在有了右值引用和移动语义的时候&#xff0c;就提出了更高效的插入方法&#xff1a;emplace_back&#xff0c;下面来介绍一下C11新特性中的emplac…

C++的emplace

一、背景 在C开发过程中&#xff0c;我们经常会用STL的各种容器&#xff0c;比如vector&#xff0c;map&#xff0c;set等&#xff0c;这些容器极大的方便了我们的开发。在使用这些容器的过程中&#xff0c;我们会大量用到的操作就是插入操作&#xff0c;比如vector的push_bac…

C++ emplace_back用法介绍

C 11对容器的push_back, push_front, insert 增加了新的用法&#xff0c;与之对应的是emplace_back&#xff0c;emplace_front, emplace. 它们的作用是在操作容器时可以调用对应类型的构造数&#xff0c;例如下面的代码&#xff1a; #include <iostream> #include <v…

C++ STL中的 emplace

英文释义&#xff08;以前还真的很少用到这个单词&#xff0c;但是经常在键入empty()函数的时候冒出来&#xff09;&#xff1a; emplace 英 [ɪmpleɪs] 美 [ɪmpleɪs] v. 放列&#xff0c;安置&#xff0c;安放; 相对于insert、push、push_back系列先构造临时变量再复制…

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; …