常用STL的操作以及特点
C++ 标准模板库(STL)提供了很多常用的数据结构和算法,极大简化了开发工作。STL 包括容器(如 vector、list、map 等)、算法(如排序、查找等)以及迭代器。以下是一些常用 STL 容器的操作以及它们的特点:
1. vector(动态数组)
vector 是一个动态数组,大小可以动态增长或缩小。
常用操作:
std::vector<int> vec = {1, 2, 3};
vec.push_back(4); // 在末尾添加元素
vec.pop_back(); // 删除末尾元素
vec.size(); // 返回元素个数
vec.empty(); // 判断是否为空
vec[1]; // 访问第二个元素
vec.clear(); // 清空所有元素
特点:
- 动态大小:可以根据需要自动扩展。
- 随机访问:支持常数时间复杂度的随机访问操作(
operator[]和at())。 - 内存管理:当需要扩展时,可能会导致重新分配内存,效率略低。
- 时间复杂度:插入/删除操作的时间复杂度为 O(1)(末尾),其他位置为 O(n)。
2. list(双向链表)
list 是双向链表,适合频繁进行插入和删除操作的场景。
常用操作:
std::list<int> lst = {1, 2, 3};
lst.push_back(4); // 在末尾添加元素
lst.push_front(0); // 在头部添加元素
lst.pop_back(); // 删除末尾元素
lst.pop_front(); // 删除头部元素
lst.size(); // 返回元素个数
lst.clear(); // 清空所有元素
lst.remove(2); // 删除所有等于 2 的元素
特点:
- 双向链表:支持常数时间复杂度的插入和删除操作。
- 顺序访问:不支持随机访问,需要顺序遍历。
- 空间占用较大:由于每个节点都需要存储前后指针,空间利用率相对较低。
- 时间复杂度:插入、删除为 O(1),访问为 O(n)。
3. deque(双端队列)
deque 是双端队列,支持两端的高效插入和删除操作。
常用操作:
std::deque<int> deq = {1, 2, 3};
deq.push_back(4); // 在末尾添加元素
deq.push_front(0); // 在头部添加元素
deq.pop_back(); // 删除末尾元素
deq.pop_front(); // 删除头部元素
deq.size(); // 返回元素个数
deq[1]; // 访问第二个元素
deq.clear(); // 清空所有元素
特点:
- 双端操作:支持 O(1) 时间复杂度的双端插入和删除。
- 随机访问:支持常数时间复杂度的随机访问。
- 适用于双端处理:比
list更灵活,可以高效操作两端。
4. stack(栈)
stack 是基于 deque 或 vector 实现的后进先出(LIFO)数据结构。
常用操作:
std::stack<int> stk;
stk.push(1); // 压栈
stk.pop(); // 弹栈
stk.top(); // 返回栈顶元素
stk.empty(); // 判断是否为空
stk.size(); // 返回栈中的元素个数
特点:
- 后进先出:只能访问栈顶元素,无法随机访问。
- 基于容器实现:默认使用
deque,但也可以使用vector或list。 - 时间复杂度:常数时间的插入、删除和访问操作。
5. queue(队列)
queue 是基于 deque 实现的先进先出(FIFO)数据结构。
常用操作:
std::queue<int> que;
que.push(1); // 入队
que.pop(); // 出队
que.front(); // 返回队首元素
que.back(); // 返回队尾元素
que.empty(); // 判断是否为空
que.size(); // 返回队列中元素个数
特点:
- 先进先出:只能操作队首和队尾。
- 时间复杂度:常数时间的插入、删除和访问操作。
6. priority_queue(优先队列)
priority_queue 是基于堆实现的队列,元素按优先级顺序出队。
常用操作:
std::priority_queue<int> pq;
pq.push(10); // 入队
pq.pop(); // 出队,移除优先级最高的元素
pq.top(); // 返回优先级最高的元素
pq.empty(); // 判断是否为空
pq.size(); // 返回队列中元素个数
特点:
- 优先级排序:默认最大堆,优先级高的元素优先出队。
- 时间复杂度:插入和删除的时间复杂度为 O(log n)。
7. set 和 unordered_set(集合)
set 是有序集合,unordered_set 是无序集合(基于哈希表实现)。
常用操作:
std::set<int> s;
s.insert(1); // 插入元素
s.erase(1); // 删除元素
s.count(1); // 判断元素是否存在
s.find(1); // 查找元素
s.size(); // 返回元素个数
s.clear(); // 清空集合
特点:
set:基于红黑树实现,支持自动排序。插入、删除、查找的时间复杂度为 O(log n)。unordered_set:基于哈希表实现,不保证元素顺序,插入、删除和查找的时间复杂度为 O(1)。
8. map 和 unordered_map(映射)
map 是有序键值对映射,unordered_map 是无序键值对映射。
常用操作:
std::map<int, std::string> mp;
mp[1] = "one"; // 插入或更新元素
mp.erase(1); // 删除键为 1 的元素
mp.find(1); // 查找键为 1 的元素
mp.size(); // 返回元素个数
mp.clear(); // 清空映射
特点:
map:基于红黑树实现,按键值排序。插入、删除、查找的时间复杂度为 O(log n)。unordered_map:基于哈希表实现,不保证元素顺序,插入、删除和查找的时间复杂度为 O(1)。
9. algorithm(算法)
STL 提供了很多常用算法,如排序、查找、遍历等。
常用操作:
std::vector<int> vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end()); // 排序
std::reverse(vec.begin(), vec.end()); // 逆序
std::find(vec.begin(), vec.end(), 4); // 查找元素 4
std::count(vec.begin(), vec.end(), 1); // 统计元素 1 的个数
std::accumulate(vec.begin(), vec.end(), 0); // 求和
特点:
- 泛型算法:与任何 STL 容器配合使用。
- 高效实现:大多数算法的时间复杂度为 O(n log n) 或 O(n)。
10. 迭代器(Iterator)
STL 容器的元素可以通过迭代器进行遍历和操作。
常用操作:
std::vector<int> vec = {1, 2, 3};
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}
特点:
- 抽象访问:可以无缝遍历任何 STL 容器,而无需关心其内部结构。
- 灵活操作:支持常见的迭代模式,如前向、双向、随机访问等。
总结
STL 提供了强大的数据结构和算法库,使得开发者可以快速、高效地解决许多常见的问题。每种容器和算法
相关文章:
常用STL的操作以及特点
C 标准模板库(STL)提供了很多常用的数据结构和算法,极大简化了开发工作。STL 包括容器(如 vector、list、map 等)、算法(如排序、查找等)以及迭代器。以下是一些常用 STL 容器的操作以及它们的特…...
025 elasticsearch索引管理-Java原生客户端
文章目录 pom.xml1创建索引2.创建索引并设置settings信息3.创建索引并设置mapping信息4.删除索引库5.给未设置mapping的索引设置mapping elasticsearch版本7.10.2,要求java客户端与之相匹配,推荐Springboot版本是2.3以上版本 依赖配置使用的是JUnit 5&am…...
Gin框架操作指南10:服务器与高级功能
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…...
AIGC技术的学习 系列一
文章目录 前言一、AIGC技术演进1.1 图像视频生成1.2. 文本生成1.3. 多模态生成1.4. 小结二、CAD&CAE软件介绍2.1. CAD软件2.2. CAE软件2.3. 小结三、AIGC技术与CAD&CAE软件的集成案例3.1. 土建设计领域3.2. 机械设计领域四、结语五、参考文献总结前言 在全球智能制造的…...
Milvus×Dify半小时轻松构建RAG系统
最近,检索增强生成(RAG)技术在AI界引起了广泛关注。作为一种将知识库与生成模型结合的新型架构,RAG大大提升了AI应用的实际表现。而在构建RAG系统时,Milvus作为业界领先的开源向量数据库,扮演着关键角色。本…...
wireshark 解密浏览器https数据包
一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数: --ssl-key-log-file"d:\log\2.log" C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --ssl-key-log-file"d:\log\2.log" 2、环境变量中新建用…...
【HTML】构建网页的基石
我的主页:2的n次方_ HTML 是一种超文本标记语言,不仅有文本,还能包含图片,音频等 1. HTML 的文件基本结构 html 标签是整个 html 文件的最顶层标签,head 标签中写页面的属性,body 标签是页面中显示的…...
rust不允许在全局区定义普通变量!
文章目录 C 中的全局变量Rust 中的全局变量设计哲学的体现 在 C 和 Rust 中,全局变量的处理方式体现了这两种语言设计哲学上的一些根本性差异: C 中的全局变量 C 允许在全局作用域中定义变量。这些变量在程序的整个生命周期内都存在,从程序开…...
量化投资中的数据驱动决策:大数据如何改变金融市场
随着科技的进步,金融行业迎来了前所未有的变革,量化投资作为其中的代表,逐渐成为投资市场的主流。量化投资是基于数学模型、数据分析以及算法策略的投资方式,与传统依赖经验和直觉的投资方法相比,它的核心优势在于能够…...
MySQL 设计数据表
一个数据表主要包含信息有 : 表名、主键、字段、数据类型、索引,本节主要介绍表的命名规范、字段命名、字段的数据类型选择。 新建的表都是新建在 “item_name” 数据库中的,新建 “item_name” 数据库命令如下 : CREATE DATABASE item_name;新建数据库…...
【大数据技术基础 | 实验一】配置SSH免密登录
文章目录 一、实验目的二、实验要求三、实验原理(一)大数据实验一体机(二)SSH免密认证 四、实验环境五、实验内容和步骤(一)搭建集群服务器(二)添加域名映射(三ÿ…...
地级市碳排放效率测算2006-2021年
为了测算碳排放效率,研究者们采用了多种方法,其中超效率SBM(Slack-Based Measure)和超效率CCR(Charnes, Cooper and Rhodes)模型是常用的两种方法。这些模型可以有效地评估决策单元的相对有效性,…...
周易解读:四象
四 象 在前面呢,我是讲完了太极与两仪的知识。这一节,我们来讲解四象的内容。 关于四象的知识,它在正式的周易的经文里面,它并没有多少用处。但是呢,在基础知识的学习里面,四象的知识,大家是…...
Java设计模式梳理:行为型模式(策略,观察者等)
行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。 策略模式 策略模式太常用了,所以把它放到最前面进行介绍。它比较简单,我就不废话,直接用代码说事吧。 下面设计的…...
【MySQL】入门篇—基本数据类型:使用LIMIT限制结果集
为了提高查询效率和用户体验,MySQL提供了LIMIT子句,用于限制查询结果的行数。LIMIT不仅可以提高性能,还可以帮助用户快速获取所需的数据,尤其在分页显示数据时非常有用。 应用场景: 分页显示:在网页应用中…...
PostgreSQL与MySQL在语法上的区别
PostgreSQL与MySQL在语法上的区别 在数据库管理系统中,PostgreSQL和MySQL都是非常受欢迎的选择。虽然它们都是一种关系型数据库管理系统(RDBMS),但它们在语法上有一些显著的区别。本文将介绍PostgreSQL和MySQL在语法上的主要区别。 数据类型 PostgreS…...
frameworks 之InputDispatcher
frameworks 之InputDispatcher 1. 填充Iq2.进入循环3.进入oq4. 发布消息,并将数据放进去wq5. 接收消息6. 移除wq android 输入事件 主要分 2个流程 事件读取 和 事件分发。本文讲解事件分发流程。 涉及到的类如下 -frameworks/native/services/inputflinger/Input…...
ESP32-IDF GPIO 专题
目录 一、基本介绍1、配置结构体2、API2.1 gpio_config2.2 gpio_reset_pin2.3 gpio_set_intr_type2.4 gpio_intr_enable2.5 gpio_intr_disable2.6 gpio_set_level2.7 gpio_get_level2.8 gpio_set_direction2.9 gpio_set_pull_mode2.10 gpio_isr_register2.11 gpio_install_isr_…...
深度学习代码学习笔记2
1、torch.max correct 0 total 0 for xb,yb in valid_dl:outputs model(xb)_,predicted torch.max(outputs.data,1)total yb.size(0) #yb.size(0) 返回的是张量 yb 在第 0 维的大小,也就是 yb 中的样本数量。correct (predicted yb).sum().item() print(…...
016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)
第一步:搭建CAD类库dll开发环境。 第二步:添加窗体 第三步:添加控件 第四步:双击控件,在控件点击方法内输入代码 第五步:在主程序内实例化新建的form类,并弹窗form窗体 第六步:CAD命…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
