当前位置: 首页 > 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模型的层间通信与数据解封装...

Vector容器详解

Vector容器详解 本文将详细介绍C#中的Vector容器&#xff0c;包括其定义、特点、使用方法以及示例代码。 目录 Vector容器简介Vector容器的特点Vector容器的使用方法示例代码 1. Vector容器简介 Vector容器是一种动态数组&#xff0c;它可以自动调整大小以容纳更多的元素。…...

设计模式-抽象工厂(创建型)

创建型-抽象工厂 角色 抽象工厂&#xff1a; 声明创建一个族产品对象的方法&#xff0c;每个方法对应一中产品&#xff0c;抽象工厂可以是接口&#xff0c;也可以是抽象类&#xff1b;具体工厂&#xff1a; 实现抽象工厂接口&#xff0c;复杂创建具体的一族产品&#xff1b;抽…...

攻防世界---web---Web_php_unserialize

1、题目描述 2、 3、分析代码 class Demo { private $file fl4g.php; }&#xff1a;定义了一个名为Demo的类&#xff0c;该类有一个私有属性$file&#xff0c;默认值为fl4g.php。 $a serialize(new Demo);&#xff1a;创建了一个Demo类的实例&#xff0c;并对其进行序列化&a…...

嵌入式学习记录

一 环境搭建 1.Ubuntu ssh登陆开发板&#xff0c;短命令替换ssh命令 交叉编译命令 sudo gedit ~/.bashrc # 文件结尾加入&#xff1a; alias tob"ssh root192.168.1.104" alias gb"arm-buildroot-linux-gnueabihf-gcc"往后终端输入top 相当于输入ssh roo…...

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时&#xff0c;每执行一条import语句都会创建一个新的命名空间&#xff08;namespace&#xff09;&#xff0c;并且在该命名…...

idea mac快捷键

Mac快捷键 快捷键 说明 ⌘ F 在当前窗口查找 ⌘ ⇧ F 在全工程查找 ⌘ ⇧ ⌥ N 查找类中的方法或变量 F3 / ⇧ F3 移动到搜索结果的下/上一匹配处 ⌘ R 在当前窗口替换 ⌘ ⇧ R 在全工程替换 ⌘ ⇧ V 可以将最近使用的剪贴板内容选择插入到文本 ⌥…...

Day1——一些感想,学习计划和自我激励(不重要,跳过吧)

笨人刚刚接触计算机的时候&#xff0c;属于是两眼一抹黑。高考后玩了一整个暑假&#xff0c;脑子已经丢掉了&#xff0c;学起来很痛苦&#xff0c;但是也在学习过程中接触到了很多新鲜的东西&#xff0c;现在对于计算机的各种方向&#xff0c;我都很想试试&#xff08;试试就逝…...

网络安全渗透工具汇总

一、HackBar github地址&#xff1a;https://github.com/Mr-xn/hackbar2.1.3.git 介绍 HackBar是一款基于浏览器的渗透测试工具&#xff0c;可以简化目标网站的攻击流程。它可以轻松地注入JavaScript和其他脚本&#xff0c;进行SQL注入、XSS攻击、各种类型的扫描等。该工具…...

JavaScript 学习笔记 总结

回顾&#xff1a; Web页面标准 页面结构&#xff1a;HTML4、HTML5页面外观和布局&#xff1a;CSS页面行为&#xff1a;JavaScript强调三者的分离前后端分离开发模式 响应式设计Bootstrap框架入门 Bootstrap总结 基础 下载和使用基础样式&#xff1a;文本样式、图片样式、表格…...

分布式架构与分布式理论

文章目录 分布式架构什么是分布式系统分布式系统特性分布式系统面临的问题 分布式理论数据一致性CAP理论BASE理论 分布式架构 什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 所谓分…...

网站访问统计js代码/app推广平台网站

相信初学者在学习Python的过程中&#xff0c;不可避免的总会遇到 if __name__ main语句&#xff0c;虽然一直知道它的作用&#xff0c;但是可能一直比较模糊&#xff0c;今天菜鸟分析就与大家一起举例说说我的理解。 举个例子&#xff0c;我们在下面在test.py中写入如下代码&a…...

在线设计工具的网站怎么做/百度地图导航2021最新版

本题考查 动态规划问题&#xff08;LCS算法&#xff09;&#xff0c;因为题目要求元素可重复&#xff0c;所以判断赋值的状态方程与原始LCS有区别 动态规划介绍 动态规划的核心就是&#xff1a;根据之前已经解决的子问题的解来求解父问题&#xff0c;换句话说“先解决子问题…...

常州便宜的做网站服务/外链工具xg

Python 爬虫模拟登录 Python 爬虫模拟登录是使用脚本实现自动登录&#xff0c;部分站点需要逆向加密逻辑&#xff0c;更多的站点会采用验证码进行鉴权验证。 本文为大家带来最简单的登录&#xff0c;其核心用到的是 requests 模拟 POST 请求。 本次练习使用的站点是 https:/…...

html5个人网站模板/网络营销策划是什么

题目&#xff1a; 给你两个长度相同的字符串&#xff0c;s 和 t。 将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销&#xff08;开销可能为 0&#xff09;&#xff0c;也就是两个字符的 ASCII 码值的差的绝对值。 用于变更字符串的最大预算是 maxCost。在…...

注册免费的网站有吗/推广方案怎么写

http://blog.csdn.net/liuyez123/article/details/50857621 1、 概述 微软在”WDK7600“以后就不再提供独立的内核驱动开发包了&#xff0c;而是必须首先安装微软集成开发环境VisualStudio&#xff0c;然后再从微软官网下载集成的WDK开发包、或者离线安装包&#xff0c;但是…...

wordpress 标签函数/市场营销推广方案

便携式键盘市场的企业竞争态势 该报告涉及的主要国际市场参与者有Razer、Microsoft、A4Tech、Casio、RockJam、Hamzer、Logitech、Yamaha、HP、Best Choice Products、AirTurn、ChromaCast、Generic、LIPPO、Andoer等。这些参与者的市场份额、收入、公司概况和SWOT分析都包含在…...