代码随想录八股训练营第三十六天| C++
前言
一、push_back()和emplace_back()的区别?
1.1.push_back():
1.2.emplace_back():
1.3.区别总结:
1.4.使用场景:
二、map dequeu list 的实现原理?
2.1.std::map:
2.2. std::deque:
2.3. std::list:
2.4. 区别总结:
总结
前言
在C++编程中,选择合适的容器对于优化程序性能和内存使用至关重要。std::vector、std::map、std::deque和std::list是C++标准库中常用的几种容器,它们各自具有独特的特性和适用场景。理解这些容器的实现原理和操作方法,可以帮助开发者更加高效地使用它们。本文将详细探讨push_back()和emplace_back()的区别,以及std::map、std::deque和std::list的实现原理。
一、push_back()和emplace_back()的区别?
在C++标准库中,push_back()和emplace_back()都是用于向容器(如std::vector、std::list等)的末尾添加元素的成员函数。它们的主要区别在于元素的添加方式:
1.1.push_back():
push_back()函数接受一个元素作为参数,这个元素可以是一个对象、一个对象的拷贝或者是一个对象的移动引用。- 当你使用
push_back()时,如果传入的是一个对象的拷贝,那么这个对象会被拷贝构造到容器中。如果传入的是一个对象的移动引用,那么这个对象会被移动构造到容器中。
container.push_back(value);
1.2.emplace_back():
emplace_back()函数接受一个或多个参数,这些参数将被用来就地(in-place)构造一个元素,即直接在容器的内存空间中构造元素,而不需要先构造一个临时对象再拷贝或移动。emplace_back()通常用于避免不必要的拷贝或移动操作,提高效率。
container.emplace_back(arg1, arg2, ...);
1.3.区别总结:
push_back()总是涉及到对象的拷贝或移动,而emplace_back()则直接在容器的内存中构造对象。emplace_back()通常比push_back()更高效,因为它避免了额外的拷贝或移动操作。emplace_back()允许使用初始化列表来构造对象,这在某些情况下非常有用,比如当你需要构造一个对象,而这个对象的构造函数不接受单独的参数时。
1.4.使用场景:
vector通常在内存使用上更紧凑,因为它是一个连续的存储块。list由于每个元素都需要额外的空间来存储指针(至少两个指针,指向前一个和后一个元素),因此内存使用上不如vector紧凑。
std::vector<int> vec;
vec.push_back(10); // 拷贝或移动10到vec中
vec.emplace_back(20); // 直接在vec中构造一个值为20的int对象
二、map dequeu list 的实现原理?
在C++标准库中,std::map、std::deque和std::list是三种不同的容器,它们各自有不同的实现原理和数据结构:
2.1.std::map:
- 数据结构:
std::map通常是基于红黑树实现的。红黑树是一种自平衡的二叉搜索树,它保证了树的平衡性,使得最坏情况下的查找、插入和删除操作的时间复杂度为O(log n)。 - 元素存储: 每个节点存储一个键值对(
std::pair<const Key, T>),其中键是唯一的,并且按照键的顺序自动排序。 - 操作: 插入、删除和查找操作都是通过对红黑树进行相应的树操作来完成的,如旋转和重新着色。
2.2. std::deque:
- 数据结构:
std::deque(double-ended queue)通常由一个或多个动态数组(也称为块)和一个指向这些数组的指针数组组成。每个动态数组可以存储固定数量的元素。 - 元素存储: 元素可以存储在这些动态数组中的任意位置,
std::deque维护了指向这些数组的指针,以及每个数组中元素的起始和结束位置。 - 操作: 在两端插入和删除元素是非常高效的,因为可以在常数时间内完成,不需要移动其他元素。但是,如果需要在中间位置插入或删除元素,则可能需要移动多个元素,这在最坏情况下的时间复杂度为O(n)。
2.3. std::list:
- 数据结构:
std::list是一个双向链表。每个节点包含一个元素和两个指针,分别指向前一个节点和后一个节点。 - 元素存储: 元素在链表中按顺序存储,每个元素都通过指针与前一个和后一个元素相连。
- 操作: 插入和删除操作非常高效,因为只需要修改相邻节点的指针。这些操作的时间复杂度为O(1),前提是你已经有了要插入或删除位置的迭代器。查找特定元素需要从头开始遍历链表,直到找到目标元素,因此查找操作的时间复杂度为O(n)。
2.4. 区别总结:
std::map提供了基于键的快速查找和有序存储,但不支持在中间位置的高效插入和删除。std::deque提供了在两端的快速插入和删除,以及随机访问能力,但不支持基于键的查找。std::list提供了高效的插入和删除操作,无论位置如何,但不支持随机访问和基于键的查找。
总结
本文首先分析了push_back()和emplace_back()这两种向容器添加元素的方法。push_back()通过拷贝或移动对象来添加元素,而emplace_back()则直接在容器内存中构造对象,避免了不必要的拷贝或移动,从而提高了效率。接着,文章深入探讨了std::map、std::deque和std::list三种容器的实现原理和数据结构。std::map基于红黑树,提供了基于键的快速查找和有序存储;std::deque由动态数组组成,支持两端的快速插入和删除;std::list则是一个双向链表,提供了高效的插入和删除操作。每种容器都有其特定的使用场景和性能特点,选择合适的容器对于提高程序的效率和性能至关重要。
相关文章:
代码随想录八股训练营第三十六天| C++
前言 一、push_back()和emplace_back()的区别? 1.1.push_back(): 1.2.emplace_back(): 1.3.区别总结: 1.4.使用场景: 二、map dequeu list 的实现原理? 2.1.std::map: 2.2. std::deque: 2.3. std::list: 2.4. 区别总结: 总结 前言…...
学习计算机网络
a类0~127,b类128~191,c类192~223 网络地址:看子网掩码,分网络位和主机位,后面是主机位,主机位全部为0,网络地址。 直接广播地址:看子网掩码,分网络位和主机位ÿ…...
Django发送邮件
【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…...
T7:咖啡豆识别
T7:咖啡豆识别 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型**1、手动搭建2、直接调用官方模型 **四、编译模型****五、训练模型****六、模型评估****七、预测**八、暂时总结…...
【MATLAB】FIR滤波器的MATLAB实现
FIR滤波器的MATLAB实现 FIR滤波器的设计fir1函数fir2函数 与IIR滤波器相比,FIR滤波器既有其优势也有其局限性。FIR滤波器的主要优点包括: 精确的线性相位响应;永远保持稳定性;设计方法通常是线性的;在硬件实现中具有更…...
【RabbitMQ之一:windows环境下安装RabbitMQ】
目录 一、下载并安装Erlang1、下载Erlang2、安装Erlang3、配置环境变量4、验证erlang是否安装成功 二、下载并安装RabbitMQ1、下载RabbitMQ2、安装RabbitMQ3、配置环境变量4、验证RabbitMQ是否安装成功5、启动RabbitMQ服务(安装后服务默认自启动) 三、安…...
ISO26262和Aspice之间的关联
ASPICE 介绍: ASPICE(Automotive Software Process Improvement and Capability dEtermination)是汽车软件过程改进及能力评定的模型,它侧重于汽车软件的开发过程。ASPICE 定义了一系列的过程和活动,包括需求管理、软…...
对极约束及其性质 —— 公式详细推导
Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…...
【论文精读】SCINet-基于降采样和交互学习的时序卷积模型
《SCINet: Time Series Modeling and Forecasting with Sample Convolution and Interaction》的作者团队来自香港中文大学,发表在NeurIPS 2022会议上。 动机 该论文的出发点是观察到时间序列数据具有独特的属性:即使在将时间序列下采样成两个子序列后,时间关系(例如数据…...
深度学习与大模型第1课环境搭建
文章目录 深度学习与大模型第1课环境搭建1. 安装 Anaconda2. 修改环境变量2.1 修改 .condarc 文件2.2 使用 Anaconda Prompt 修改环境变量 3. 新建 .ipynb 文件 机器学习基础编程:常见问题: 深度学习与大模型第1课 环境搭建 1. 安装 Anaconda 首先&am…...
JDK新特性
LTS Record jdk16 不是方法 是一个定 # Sealed Class/Interface jdk17 限制只能由某些类继承 CompletableFuture jkd8 PatternMatching of instanceOf jdk16 switch expressions jdk14 Stream.collect() Collector Collector API Collector.groupBy Collector实战 1. …...
数据处理与数据填充在Pandas中的应用
在数据分析和机器学习项目中,数据处理是至关重要的一步。Pandas作为Python中用于数据分析和操作的一个强大库,提供了丰富的功能来处理和清洗数据。本文将深入探讨Pandas在数据处理,特别是数据填充方面的应用。 在实际的数据集中,…...
【百日算法计划】:每日一题,见证成长(010)
题目 合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路 引入一个带虚拟头结点和tail指针的…...
【WPF】WPF学习之【二】布局学习
WPF布局学习 常用布局Grid网格布局StackPanel 布局CanvasDockPanel布局WrapPanel布局 常用布局 1、StackPanel: 学习如何使用StackPanel进行垂直和水平布局。 2、Grid: 掌握Grid的网格布局技术。 3、Canvas: 了解Canvas的绝对定位布局。 4、DockPanel: 学习DockPanel的停靠…...
KEIL中编译51程序 算法计算异常的疑问
KEIL开发 51 单片机程序 算法处理过程中遇到的问题 ...... by 矜辰所致前言 因为产品的更新换代, 把所有温湿度传感器都换成 SHT40 ,替换以前的 SHT21。在 STM32 系列产品上的替换都正常,但是在一块 51 内核的无线产品上面,数据…...
pikachu文件包含漏洞靶场
本地文件包含 1、先随意进行提交 可以得出是GET传参 可以在filename参数进行文件包含 2、准备一个2.jpg文件 内容为<?php phpinfo();?> 3、上传2.jpg文件 4、访问文件保存的路径uploads/2.jpg 5、将我们上传的文件包含进来 使用../返回上级目录 来进行包含木马文件 …...
基于DPU与SmartNIC的K8s Service解决方案
1. 方案背景 1.1. Kubernetes Service介绍 Kubernetes Service是Kubernetes中的一个核心概念,它定义了一种抽象,用于表示一组提供相同功能的Pods(容器组)的逻辑集合,并提供了一种方式让这些Pods能够被系统内的其他组…...
SLM561A系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力
SLM561A系列选型参考: SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …...
Requests库对session的支持
场景:如何获取登录时响应消息中的sessionid,以及如何在后续请求中把sessionid添到cookie中 Requests库提供了一个Session类,通过requests库中的session对象,requests库会自动帮我们保存服务端返回的cookie数据(set-cookie里的内容…...
利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别
1. Python部分:导出ONNX模型 首先,我们需要在Python中定义并导出一个已经训练好的验证码识别模型。以下是完整的Python代码: import string import torch import torch.nn as nn import torch.nn.functional as FCHAR_SET string.digits# …...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
