当前位置: 首页 > news >正文

C++中的顺序容器(一)

文章目录

  • 顺序容器概述
    • 所有容器类型都支持的操作
    • 迭代器
    • 容器定义与初始化
      • 将一个容器初始化为另一个容器的拷贝
      • 标准库array具有固定大小
    • 赋值和swap
    • 关系运算符
  • 顺序容器的特有操作
    • 向顺序容器添加元素
    • 访问元素
    • 删除元素
    • 特殊的forward_list操作
    • 改变容器的大小
    • 容器操作可能是迭代器失效

顺序容器概述

元素在顺序容器中顺序与其加入容器时的位置相对应。
在这里插入图片描述
选择合适的顺序容器:

  • 除非有很好的理由选择其他容器,否则使用vector;
  • 程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list;
  • 要求随机访问,vector、deque;
  • 要求在容器的中间插入或删除,list或forward_list;
  • 只在头尾插入或删除,deque;
  • 输入时要求在中间插入元素,随后要求随机访问:如果在中间插入只是为了排序的话,可以在vector尾部添加元素之后在使用sort排序;如果必须在中间插入,则可以先使用list接收数据,在将接收的数据拷贝到vector中。

如果不确定应该使用哪种容器,那么可以在程序中只是用vector或list公共的操作:使用迭代器,不使用下标操作,避免随机访问。

虽然我们可以在容器中保存几乎任何类型,但某些容器操作对元素类型有自己的特殊要求。例如顺序容器的一个版本的构造函数接收容器大小参数,并使用元素类型的默认构造函数。我们可以定义保存这种类型对象的容器,但在构造这种容器时不能只传递元素数量:

//假定noDefault是一个没有构造函数的类型
vector<noDefault> v1(10, init); //ok
vector<noDefault> v1(10); //err,必须提供一个元素初始化器

所有容器类型都支持的操作

在这里插入图片描述
在这里插入图片描述

迭代器

一个迭代器范围由一对迭代器表示,两个迭代器分别指向同一个容器中的元素或者尾元素之后的位置。可以使用begin得到第一个元素位置,end得到尾元素之后的位置。

//显式指定类型
list<string>::iterator it = a.begin();
list<string>::const_iterator it = a.begin();
//auto
auto it = a.begin(); //当a是const时,为const_iterator,否则为iterator
auto it = a.cbegin(); //const_iterator

当auto与begin或end结合使用时,获得的迭代器类型依赖于容器类型。但与cbegin或cend结合时,获得的是const_iterator。

容器定义与初始化

每个容器都定义了一个默认构造函数。除array之外,其他容器的默认构造函数都会创造一个指定类型的空容器。
在这里插入图片描述

将一个容器初始化为另一个容器的拷贝

将一个容器初始化为另一个容器的拷贝的方法有两种:

  • 可以直接拷贝整个容器,要求容器类型和元素类型必须匹配;
  • 拷贝由一个迭代器对指定的元素范围(array除外),不在要求要求容器类型和元素匹配,而要求拷贝的元素能够转化为目标元素即可。
list<string> authors = {"Mi", "Sh", "Au"};
vector<const char*> articles = {"a", "an", "the"};list<string> li(authors); //ok
deque<string> de(authors); //err
vector<string> words(articles); //err
//const char* 可以转换为string
forward_list<string> words(articles.begin(), articles.end()); //ok

标准库array具有固定大小

与内置数组一样,标准库array的大小也是类型的一部分。当定义一个array时,除了指定元素类型,还要指定容器大小:

array<int, 42> ia1; //42个默认初始化的int
array<int, 42> ia1 = {0}; //一个0,41个默认初始化的int
array<int, 42>::size_type i;

值得注意的是,内置数组不能进行拷贝或者赋值,但是array可以:

int digs[4] = {0, 1, 2, 3};
int cpy[4] = digs; //err,内置数组不支持拷贝或赋值
array<int, 4> digits = {0, 1, 2, 3}; //初始化后,不可使用{}赋值
array<int, 4> copy = digits; //ok,要求类型(容器类型以及大小)一致

赋值和swap

在这里插入图片描述
赋值运算符要求左右两边的运算对象具有相同的类型,它将右边运算对象中的所有元素拷贝到左边运算对象中。assign也可以实现类似的功能,但不在要求要求容器类型和元素匹配,而要求拷贝的元素能够转化为目标元素即可。

swap可以交换两个相同类型容器的内容。除了array之外,swap不会对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间完成,swap只是交换了两个容器之间的内部结构。这意味着指向容器(string除外)的迭代器、引用或指针在swap之后不会失效。

例如,iter在swap之前指向svec[3],在swap之后就会指向svec2[3]:

vector<string> svec1(10);
vector<string> svec2(10);
swap(svec1, svec2);

与其他容器不同,swap会真正交换array中元素,虽然swap不会使得array中的指针、引用、迭代器失效,但是在swap之后解引用得到的结果是另外一个array相应位置的值。

关系运算符

每个容器都支持相等运算符(==、!=),除了无序关联容器都支持关系运算符(>、>=、<、<=)。关系运算符左右两边运算对象必须是相同类型的容器,且必须保存相同类型的元素。并且只有当其元素也定义了相应的比较运算时,才可进行比较。

顺序容器的特有操作

向顺序容器添加元素

除array外,所有标准库容器都提供灵活的内存管理。在运行时可以动态添加或删除元素来改变容器的大小。
在这里插入图片描述
当我们用一个对象来初始化容器时,或将一个对象插入(push、insert)到容器时,实际上放入到容器中的是对象值得拷贝,而不是对象本身。值得注意得是,使用emplace时,则是将参数传递给元素得构造函数,并在容器内直接构造元素。

//使用三个参数构造函数
c.emplace_back("789", 25, 15.99);
//err
c.push_back("789", 25, 15.99);
//ok,创建一个临时对象传递给push
c.push_back(Sales_data("789", 25, 15.99));

访问元素

在这里插入图片描述
在容器中访问元素的成员函数返回的都是引用:

if(c.empty())
{c.front() = 42;auto &v = c.back();v = 1024; //改变容器中的元素auto v2 c.back;v2 = 0; //无法改变容器中元素
}

删除元素

在这里插入图片描述

特殊的forward_list操作

在这里插入图片描述
因为forward_list是单向列表,插入删除等操作会影响目标节点之前的节点,因此以目标节点的前节点作为参数。

改变容器的大小

在这里插入图片描述

容器操作可能是迭代器失效

向容器中添加元素或从容器中删除元素的操作可能会使指向容器中元素的指针、引用、迭代器失效。

添加、删除元素:

  • vector、string,且存储空间被重新分配,则指向容器的迭代器、指针和引用全部失效。如果为重新分配存储空间,则只失效指向插入后的元素的;
  • deque,插入删除到首尾之外的位置会导致指向其中元素的迭代器、指针和引用失效。
  • list、forward_list,不会失效;

使用失效的迭代器、指针或引用是严重的运行时错误。

相关文章:

C++中的顺序容器(一)

文章目录 顺序容器概述所有容器类型都支持的操作迭代器容器定义与初始化将一个容器初始化为另一个容器的拷贝标准库array具有固定大小 赋值和swap关系运算符 顺序容器的特有操作向顺序容器添加元素访问元素删除元素特殊的forward_list操作改变容器的大小容器操作可能是迭代器失…...

【复现DeepSeek-R1之Open R1实战】系列4:跑通GRPO!

目录 1 配置环境2 训练2.1 命令和配置参数2.2 num_generations2.2.1 参数定义2.2.2 参数含义2.2.3 示例2.2.4 使用场景2.2.5 示例代码 2.3 显存占用和耗时 3 结果 1 配置环境 关于环境配置&#xff0c;可以参考这篇博文&#xff1a;【复现DeepSeek-R1之Open R1实战】系列1&…...

Redis原理简述及发布订阅消息队列

目录 1 什么是Redis 2 Redis 非阻塞IO内部原理 2.1 IO多路复用策略 2.2 Reactor设计模式 3 基于PubSub的消息队列&#xff08;发布-订阅&#xff09; 由于集群之后存在多台服务器&#xff0c;并且不同客户端连接的可能是不同的服务器&#xff0c;因此在聊天过程中涉及到服…...

ThreadLocal为什么会内存溢出

每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...

假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?

前言&#xff1a;本篇文章解释了接口学习过程中的2个常见问题&#xff0c;一个是“为什么是类在使用接口”&#xff0c;另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”&#xff0c;旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…...

算法之 跳跃游戏

文章目录 55.跳跃游戏思路参考&#xff1a;56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析&#xff1a; 两种思路&#xff0c;思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr&#xff0c;如果i>mr就说明无法到达i,否则就是可以到达&#xff1b;…...

C#中的图形渲染模式

在C#中&#xff0c;图形模式通常用于定义如何渲染或处理图形。可以枚举定义如下四种图形模式&#xff1a;AUTO、GDI、DIB 和 FBO。这些模式可能用于指定不同的图形渲染技术或后端。下面是对这些模式的详细解释&#xff1a; 1. AUTO (自动模式) 含义&#xff1a;自动选择最适合…...

二.数据治理流程架构

1、数据治理流程架构核心思想&#xff1a; 该图描绘了一个以数据标准规范体系为核心&#xff0c;大数据生命周期管理为主线&#xff0c;数据资源中心为依托&#xff0c;并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…...

瑞萨RA-T系列芯片ADCGPT功能模块的配合使用

在马达或电源工程中&#xff0c;往往需要采集多路AD信号&#xff0c;且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时&#xff0c;如何根据需求来设置主要功能模块ADC&GPT&#xff0c;包括采样通道打包和分组&#xff0c;GPT触发启动…...

扩散模型中的马尔可夫链设计演进:从DDPM到Stable Diffusion全解析

一、技术原理与数学推导&#xff08;附核心公式&#xff09; 1.1 扩散过程数学建模 马尔可夫链前向过程定义&#xff1a; q(x_{1:T}|x_0) \prod_{t1}^T q(x_t|x_{t-1})噪声调度函数&#xff08;以余弦调度为例&#xff09;&#xff1a; \beta_t \frac{1 - \cos(\pi t/T)}…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…...

大模型常识:什么是大模型/大语言模型/LLM

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...

iOS 中使用 FFmpeg 进行音视频处理

在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...

SAP-ABAP:SAP的Screen Layout Designer屏幕布局设计器详解及示例

在SAP中&#xff0c;Screen Layout Designer&#xff08;屏幕布局设计器&#xff09;是用于设计和维护屏幕&#xff08;Dynpro&#xff09;布局的工具。通过Screen Layout Designer&#xff0c;您可以创建和修改屏幕元素&#xff08;如输入字段、按钮、文本、表格控件等&#x…...

一.数据治理理论架构

1、数据治理核心思想&#xff1a; 数据治理理论架构图描绘了一个由顶层设计、管控机制、核心领域和管理系统四个主要部分组成的数据治理框架。它旨在通过系统化的方法&#xff0c;解决数据治理机制缺失引发的业务和技术问题&#xff0c;并最终提升企业的数据管理水平。 数据治…...

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作&#xff08;Ollama 工具介绍与下载&#xff09;2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…...

MySQL安装MySQL服务时提示Install-Remove of the Service Denied

文章目录 问题描述排查1.字面意思2.搜索引擎3.官方文档4.源码 处理方法相关扩展 问题描述 MySQL安装MySQL服务时提示Install-Remove of the Service Denied! 详细报错如下&#xff1a; C:\Users\荷塘月色>net start mysql 服务名无效。请键入 NET HELPMSG 2185 以获得更多…...

(Windows | Linux)ssh访问服务器报错:no matching key exchange method found

问题现象 ssh user1192.168.1X.XX Unable to negotiate with 192.168.1X.XX port 22: no matching key exchange method found. Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkayal2g,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-…...

Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)

安装前检查服务器glibc版本&#xff0c;下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好&#xff0c;下载地址&#xff1a;https://pan.quark.cn/s/3137acc814c0&#xff0c;下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好&#xff0c;下载地址…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...