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

C++ STL - 容器

C++ STL(标准模板库)中的容器是一组通用的、可复用的数据结构,用于存储和管理不同类型的数据。

目录

零. 简介:

一 . vector(动态数组)

二. list(双向链表)

三. deque(双端队列)

四. set(集合)

五. map(映射)


零. 简介


STL 容器提供了一系列预定义的类,如 vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)等。

意义和作用

  1. 提高编程效率:无需自己实现常见的数据结构。
  2. 代码简洁:使用统一的接口和操作方式。
  3. 灵活性:适应不同的需求和数据类型。
  4. 可扩展性:易于添加新的容器或扩展现有容器的功能。
  5. 性能优化:经过精心设计和优化。
  6. 类型安全:在编译时进行类型检查。
  7. 代码可维护性:减少重复代码,提高代码的可读性和可维护性。

例如,使用 vector 可以方便地管理动态数组,而不需要自己手动实现动态内存分配和元素添加、删除等操作。

一 . vector(动态数组)

vector 是 C++ STL 中的一种动态数组容器。它具有以下特点和优势:

  1. 动态调整大小:可以根据需要自动调整存储空间。
  2. 高效的随机访问:支持通过索引进行快速访问。
  3. 易于使用:提供了丰富的接口和操作方法。
  4. 自动内存管理:无需手动处理内存分配和释放。

有以下常用的 API:

  • push_back():在数组末尾添加元素。
  • pop_back():删除数组末尾的元素。
  • at():通过索引访问元素,提供边界检查。
  • [] 操作符:通过索引访问元素。
  • size():获取数组中元素的数量。
  • empty():判断数组是否为空。
  • begin():获取数组的起始迭代器。
  • end():获取数组的末尾迭代器。
  • clear():清空数组中的所有元素。
  • insert():在指定位置插入元素。
  • erase():删除指定元素或指定范围的元素。

以下是一个使用 vector 的示例代码:

#include <vector>
#include <iostream>int main() {std::vector<int> numbers;// 向 vector 中添加元素numbers.push_back(1);numbers.push_back(2);numbers.push_back(3);// 输出 vector 中的元素for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

前面的文章有更详细的介绍:http://t.csdnimg.cn/QMcDR

二. list(双向链表)

list 是 C++ STL 中的双向链表容器.

它具有以下常用的 API:

  • push_back():在链表末尾添加元素。
  • push_front():在链表开头添加元素。
  • insert():在指定位置插入元素。
  • erase():删除指定元素或指定范围的元素。
  • clear():清空链表中的所有元素。
  • size():获取链表中元素的数量。
  • empty():判断链表是否为空。
  • front():获取链表开头的元素。
  • back():获取链表末尾的元素。
  • begin():获取链表的起始迭代器。
  • end():获取链表的末尾迭代器。

以下是一个使用 list 的示例代码:

#include <list>
#include <iostream>int main() {std::list<int> numbers;// 在链表末尾添加元素numbers.push_back(1);numbers.push_back(2);numbers.push_back(3);// 在链表开头添加元素numbers.push_front(0);// 输出链表中的元素for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

三. deque(双端队列)

deque 是一种可以在两端高效地进行插入和删除操作的容器。
意义和作用

  1. 高效的两端操作:可以在队列的两端快速添加和删除元素。
  2. 动态调整大小:自动根据需要调整内存。
  3. 支持随机访问:像数组一样,可以通过索引访问元素。
  4. 通用数据结构:适用于多种场景。
  5. 提高代码效率和可维护性:提供了简洁、高效的接口。

例如,可以使用 deque 来实现一个队列或栈的功能。

常用 API 包括:

  • push_back():在队列尾部添加元素。
  • push_front():在队列头部添加元素。
  • pop_back():从队列尾部删除元素。
  • pop_front():从队列头部删除元素。
  • insert():在指定位置插入元素。
  • erase():删除指定元素或指定范围的元素。
  • clear():清空队列中的所有元素。
  • size():获取队列中元素的数量。
  • empty():判断队列是否为空。
  • begin():获取队列的起始迭代器。
  • end():获取队列的末尾迭代器。

下面是一个简单的 deque 使用示例代码:

#include <deque>
#include <iostream>int main() {std::deque<int> numbers;numbers.push_back(1); //向最后面插入数据   1numbers.push_front(2);//向最钱面插入数据   2, 1numbers.push_back(3); //向最后面插入数据   2, 1,3numbers.push_front(4);//向最钱面插入数据   4, 2, 1,3std::cout << "Front: " << numbers.front() << std::endl;std::cout << "Back: " << numbers.back() << std::endl;return 0;
}

四. set(集合)

set 是一种无序且不允许重复元素的容器。

意义和作用

  1. 自动去重:无需手动处理重复元素。
  2. 快速查找:提供高效的元素查找操作。
  3. 无序存储:元素的顺序是随机的。
  4. 键值对操作:常用于存储键值。

常用的 API 包括:

  • insert():插入元素。
  • find():查找元素。
  • erase():删除元素。
  • size():获取元素数量。
  • empty():判断是否为空。

下面是一个简单的示例代码:

#include <set>
#include <iostream>int main() {std::set<int> numbers = { 1, 2, 3, 4, 5 };numbers.insert(3);//插入已有数据 3numbers.insert(6); //插入未有数据//循环打印for (std::set<int>::iterator i = numbers.begin(); i != numbers.end(); ++i){std::cout << *i << std::endl;}// 查找元素if (numbers.find(3) != numbers.end()) {std::cout << "Element found" << std::endl;}else {std::cout << "Element not found" << std::endl;}return 0;
}

五. map(映射)

map(映射)是一种关联容器,它将键(key)和值(value)进行关联。 是一种无序容器,其中键必须是唯一的。

意义和作用

  1. 提供了一种键值对的存储方式。
  2. 快速的键值查找。
  3. 自动根据键进行排序。

常用 API

  • insert():插入键值对。
  • find():根据键查找对应的值。
  • erase():删除键值对。
  • size():获取映射中键值对的数量。
  • empty():判断映射是否为空。

下面是一个简单的示例代码:

#include <map>
#include <iostream>int main() {std::map<std::string, int> grades;grades["a"] = 1;grades["b"] = 2;grades["c"] = 3;// 根据键查找值int aliceGrade = grades["a"];std::cout << "a: " << aliceGrade << std::endl;return 0;
}

扩展:

可以用来做观察者模式;

观察者模式是一种设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

在 C++ 中,可以使用观察者模式来实现 map 的变化通知。下面是一个简单的示例代码:

#include <iostream>
#include <map>
#include <string>
#include <vector>class Observer {
public:virtual void update() = 0;
};class Subject {
private:std::map<std::string, int> data;std::vector<Observer*> observers;public:void addObserver(Observer* observer) {observers.push_back(observer);}void removeObserver(Observer* observer) {auto it = std::find(observers.begin(), observers.end(), observer);if (it != observers.end()) {observers.erase(it);}}void updateObservers() {for (Observer* observer : observers) {observer->update();}}void setKeyValue(const std::string& key, int value) {data[key] = value;updateObservers();}int getValue(const std::string& key) {return data[key];}
};class DisplayObserver1 : public Observer {
public:void update() override {std::cout << "Data changed1" << std::endl;}
};class DisplayObserver2 : public Observer {
public:void update() override {std::cout << "Data changed2" << std::endl;}
};int main() {Subject subject;DisplayObserver1 observer1;subject.addObserver(&observer1);DisplayObserver2 observer2;subject.addObserver(&observer2);subject.setKeyValue("key1", 10);return 0;
}

相关文章:

C++ STL - 容器

C STL&#xff08;标准模板库&#xff09;中的容器是一组通用的、可复用的数据结构&#xff0c;用于存储和管理不同类型的数据。 目录 零. 简介&#xff1a; 一 . vector&#xff08;动态数组&#xff09; 二. list&#xff08;双向链表&#xff09; 三. deque&#xff08…...

AI生成沉浸式3D世界(空间照片/视频)

面向Vision Pro等空间计算设备的产品指南 & 技术实现路径 一、通俗理解 ldi3格式概览:这是一种创新的3D内容格式,专为Vision Pro、Quest等VR头戴设备设计,让你能沉浸在一个几可乱真的三维世界,体验仿佛亲临其境的感受。 内容创作:利用开源工具,结合多角度摄像捕捉,…...

【Vue】异步更新 $nextTick

文章目录 一、引出问题二、解决方案三、代码实现 一、引出问题 需求 编辑标题, 编辑框自动聚焦 点击编辑&#xff0c;显示编辑框让编辑框&#xff0c;立刻获取焦点 即下图上面结构隐藏&#xff0c;下面结构显示&#xff0c;并且显示的时候让它自动聚焦。 代码如下 问题 “…...

【uCOS-III-编程指南】

uCOS-III-编程指南 ■ [野火]uCOS-III内核实现与应用开发实战指南■■■■ ■ [野火]uCOS-III内核实现与应用开发实战指南 添加链接描述 ■ ■ ■ ■...

2004NOIP普及组真题 2. 花生采摘

线上OJ&#xff1a; 【04NOIP普及组】花生采摘 核心思想&#xff1a; 1、本题为贪心即可。 2、因为本题严格限制了顺序&#xff0c;所以先把每个节点的花生数量按降序排序。然后逐一判断下一个花生是否需要去采摘即可 3、每一次采摘完&#xff0c;记录耗时 t 以及采集的花…...

SAP-SD-21-定义用于定价补充的定价过程

图9 维护条件类型...

Android AAudio——C API创建AudioTrack(六)

虽然 AAudio 试图提供一种直接的硬件访问途径,但在某些场景下,如处理兼容性问题、使用系统服务(如 AudioFlinger)或者在某些设备上,使用 AudioTrack 可能是最有效或最合适的途径。这并不违背 AAudio 的初衷,因为它的目标是提供高性能的音频处理,而不是避免使用系统服务。…...

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后&#xff0c;您将能够&#xff1a; • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中&#xff0c;将要求您连接网络设备并配置主机实现基本的网络…...

SqlServer2016企业版安装

前言 好久没有知识的累积&#xff0c;最近工作上遇到新的SqlServer2016安装&#xff0c;记录一下 参考文章 SQL Server 2016软件安装包和安装教程 - 哔哩哔哩 (bilibili.com) 安装包准备 需要提前准备软件安装包如下 cn_sql_server_2016_enterprise_x64_dvd_8699450&…...

HBase数据库面试知识点:第一部分 - 基础概念与特点(持续更新中)

目录 一、HBase基础概念 1. HBase定义 2. 核心组件 3. HBase的特点 二、HBase与传统RDBMS的区别 1. 数据类型 2. 数据操作 3. 存储方式 4. 伸缩性 5. 事务性 三、HBase数据模型 四、HBase的特点 五、HBase与Hadoop生态系统的关系 一、HBase基础概念 1. HBase定义 …...

一个高效的go语言字符串转驼峰命名算法实现函数

在go语言的开发中我们经常需要对各种命名进行规范&#xff0c; 今天给大家介绍的是一个高效的将字符串转 驼峰命名 &#xff08;即 首字母大写的命名方式&#xff09;的函数。 // 字符串转驼峰命名 // author tekintian <tekintiangmail.com> func CamelStr(str string) …...

Python中__init__方法的魔力:构建对象的基石

Python中__init__方法的魔力&#xff1a;构建对象的基石 在Python的世界中&#xff0c;__init__方法是一个特殊的存在。它不仅是类的构造函数&#xff0c;更是对象生命周期的起点。通过__init__方法&#xff0c;我们可以初始化对象的状态&#xff0c;设置属性&#xff0c;甚至…...

Appium安装及配置(Windows环境)

在做app相关自动化测试&#xff0c;需要使用appium来做中转操作&#xff0c;下面来介绍一下appium的环境安装配置 appium官方文档&#xff1a;欢迎 - Appium Documentation 一、下载appium 下载地址&#xff1a;https://github.com/appium/appium-desktop/releases?page3 通…...

CANOE制造dll文件,以及应用dll文件

1、使用canoe自带的capl dll 2、然后使用Visual Studio 2022 打开项目 3、项目打开后修改下项目属性 4、修改capldll.cpp文件 4.1 添加的内容 void CAPLEXPORT far CAPLPASCAL appSum(long i, long j, long* s){*s i j;} {"sum", (CAPL_FARCALL)appSum, "…...

C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…...

Master-Worker 架构的灰度发布难题

作者&#xff1a;石超 一、前言 Master-Worker 架构是成熟的分布式系统设计模式&#xff0c;具有集中控制、资源利用率高、容错简单等优点。我们数据中心内的几乎所有分布式系统都采用了这样的架构。 &#xfeff; 我们曾经发生过级联故障&#xff0c;造成了整个集群范围的服…...

钢基础知识介绍

钢铁是一种铁碳合金&#xff0c;含有一定量的碳和其他合金元素&#xff0c;如硅、锰等。而钢材则是经过加工处理后的钢铁材料&#xff0c;具有更高的强度、硬度、塑性和韧性。钢铁的硬度、强度和耐磨性相对较低&#xff0c;而钢材经过加工处理后&#xff0c;其硬度、强度和耐磨…...

linux 系统监控脚本

1.对CPU的监控函数 function GetCpu(){cpu_numgrep -c "model name" /proc/cpuinfocpu_usertop -b -n 1 | grep Cpu | awk {print $2} | cut -f 1 -d "%"cpu_systemtop -b -n 1 | grep Cpu | awk {print $4} | cut -f 1 -d "%"cpu_idletop -b -…...

K8s Pod的QoS类

文章目录 OverviewPod的QoS分类Guaranteed1.如何将 Pod 设置为保证Guaranteed2. Kubernetes 调度器如何管理Guaranteed类的Pod Burstable1. 如何将 Pod 设置为Burstable2.b. Kubernetes 调度程序如何管理 Burstable Pod BestEffort1. 如何将 Pod 设置为 BestEffort2. Kubernete…...

TCP/IP协议栈

一、TCP/IP协议栈和OSI参考模型对比 二、TCP/IP五层功能 三、TCP/IP模型的层间通信与数据封装 四、TCP/IP模型的层间通信与数据解封装...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...