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

常用STL的操作以及特点

C++ 标准模板库(STL)提供了很多常用的数据结构和算法,极大简化了开发工作。STL 包括容器(如 vectorlistmap 等)、算法(如排序、查找等)以及迭代器。以下是一些常用 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 是基于 dequevector 实现的后进先出(LIFO)数据结构。

常用操作:
std::stack<int> stk;
stk.push(1);        // 压栈
stk.pop();          // 弹栈
stk.top();          // 返回栈顶元素
stk.empty();        // 判断是否为空
stk.size();         // 返回栈中的元素个数
特点:
  • 后进先出:只能访问栈顶元素,无法随机访问。
  • 基于容器实现:默认使用 deque,但也可以使用 vectorlist
  • 时间复杂度:常数时间的插入、删除和访问操作。

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. setunordered_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. mapunordered_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 标准模板库&#xff08;STL&#xff09;提供了很多常用的数据结构和算法&#xff0c;极大简化了开发工作。STL 包括容器&#xff08;如 vector、list、map 等&#xff09;、算法&#xff08;如排序、查找等&#xff09;以及迭代器。以下是一些常用 STL 容器的操作以及它们的特…...

025 elasticsearch索引管理-Java原生客户端

文章目录 pom.xml1创建索引2.创建索引并设置settings信息3.创建索引并设置mapping信息4.删除索引库5.给未设置mapping的索引设置mapping elasticsearch版本7.10.2&#xff0c;要求java客户端与之相匹配&#xff0c;推荐Springboot版本是2.3以上版本 依赖配置使用的是JUnit 5&am…...

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;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系统

最近&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术在AI界引起了广泛关注。作为一种将知识库与生成模型结合的新型架构&#xff0c;RAG大大提升了AI应用的实际表现。而在构建RAG系统时&#xff0c;Milvus作为业界领先的开源向量数据库&#xff0c;扮演着关键角色。本…...

wireshark 解密浏览器https数据包

一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数&#xff1a; --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】构建网页的基石

我的主页&#xff1a;2的n次方_ HTML 是一种超文本标记语言&#xff0c;不仅有文本&#xff0c;还能包含图片&#xff0c;音频等 1. HTML 的文件基本结构 html 标签是整个 html 文件的最顶层标签&#xff0c;head 标签中写页面的属性&#xff0c;body 标签是页面中显示的…...

rust不允许在全局区定义普通变量!

文章目录 C 中的全局变量Rust 中的全局变量设计哲学的体现 在 C 和 Rust 中&#xff0c;全局变量的处理方式体现了这两种语言设计哲学上的一些根本性差异&#xff1a; C 中的全局变量 C 允许在全局作用域中定义变量。这些变量在程序的整个生命周期内都存在&#xff0c;从程序开…...

量化投资中的数据驱动决策:大数据如何改变金融市场

随着科技的进步&#xff0c;金融行业迎来了前所未有的变革&#xff0c;量化投资作为其中的代表&#xff0c;逐渐成为投资市场的主流。量化投资是基于数学模型、数据分析以及算法策略的投资方式&#xff0c;与传统依赖经验和直觉的投资方法相比&#xff0c;它的核心优势在于能够…...

MySQL 设计数据表

一个数据表主要包含信息有 : 表名、主键、字段、数据类型、索引&#xff0c;本节主要介绍表的命名规范、字段命名、字段的数据类型选择。 新建的表都是新建在 “item_name” 数据库中的&#xff0c;新建 “item_name” 数据库命令如下 : CREATE DATABASE item_name;新建数据库…...

【大数据技术基础 | 实验一】配置SSH免密登录

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;大数据实验一体机&#xff08;二&#xff09;SSH免密认证 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;搭建集群服务器&#xff08;二&#xff09;添加域名映射&#xff08;三&#xff…...

地级市碳排放效率测算2006-2021年

为了测算碳排放效率&#xff0c;研究者们采用了多种方法&#xff0c;其中超效率SBM&#xff08;Slack-Based Measure&#xff09;和超效率CCR&#xff08;Charnes, Cooper and Rhodes&#xff09;模型是常用的两种方法。这些模型可以有效地评估决策单元的相对有效性&#xff0c…...

周易解读:四象

四 象 在前面呢&#xff0c;我是讲完了太极与两仪的知识。这一节&#xff0c;我们来讲解四象的内容。 关于四象的知识&#xff0c;它在正式的周易的经文里面&#xff0c;它并没有多少用处。但是呢&#xff0c;在基础知识的学习里面&#xff0c;四象的知识&#xff0c;大家是…...

Java设计模式梳理:行为型模式(策略,观察者等)

行为型模式 行为型模式关注的是各个类之间的相互作用&#xff0c;将职责划分清楚&#xff0c;使得我们的代码更加地清晰。 策略模式 策略模式太常用了&#xff0c;所以把它放到最前面进行介绍。它比较简单&#xff0c;我就不废话&#xff0c;直接用代码说事吧。 下面设计的…...

【MySQL】入门篇—基本数据类型:使用LIMIT限制结果集

为了提高查询效率和用户体验&#xff0c;MySQL提供了LIMIT子句&#xff0c;用于限制查询结果的行数。LIMIT不仅可以提高性能&#xff0c;还可以帮助用户快速获取所需的数据&#xff0c;尤其在分页显示数据时非常有用。 应用场景&#xff1a; 分页显示&#xff1a;在网页应用中…...

PostgreSQL与MySQL在语法上的区别

PostgreSQL与MySQL在语法上的区别 在数据库管理系统中&#xff0c;PostgreSQL和MySQL都是非常受欢迎的选择。虽然它们都是一种关系型数据库管理系统(RDBMS)&#xff0c;但它们在语法上有一些显著的区别。本文将介绍PostgreSQL和MySQL在语法上的主要区别。 数据类型 PostgreS…...

frameworks 之InputDispatcher

frameworks 之InputDispatcher 1. 填充Iq2.进入循环3.进入oq4. 发布消息&#xff0c;并将数据放进去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 维的大小&#xff0c;也就是 yb 中的样本数量。correct (predicted yb).sum().item() print(…...

016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)

第一步&#xff1a;搭建CAD类库dll开发环境。 第二步&#xff1a;添加窗体 第三步&#xff1a;添加控件 第四步&#xff1a;双击控件&#xff0c;在控件点击方法内输入代码 第五步&#xff1a;在主程序内实例化新建的form类&#xff0c;并弹窗form窗体 第六步&#xff1a;CAD命…...

【亲测可行】最新ubuntu搭建rknn-toolkit2

文章目录 🌕结构图(ONNX->RKNN)🌕下载rknn-toolkit2🌕搭建环境🌙配置镜像源🌙conda搭建python3.8版本的虚拟环境🌙进入packages目录安装依赖库🌕测试安装是否成功🌕其它🌙rknn-toolkit2🌙rknn_model_zoo🌙关于部署的博客发布本文的时间为2024.10.13…...

pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…...

16年408计算机网络

第一题&#xff1a; 解析&#xff1a; 首先我们要清楚R1,R2,R3是路由器&#xff08;网络层&#xff09;&#xff0c;Switch是以太网交换机&#xff08;数据链路层&#xff09;&#xff0c;Hub是集线器&#xff08;物理层&#xff09;。 由此可见路由器实现的最高功能层是3层&am…...

PDF 转 CAD 工具:实现文档格式高效转换的利器

如果你从事设计相关PDF和CAD作为两种常见且重要的文件格式&#xff0c;在不同的领域都有着广泛的应用。今天&#xff0c;我们就来介绍几个各具特色的PDF转换成CAD工具。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn/pdf2word/ 该工具在跨领域应用中表现出明确…...

基于springboot的画师约稿系统的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的画师约稿系统的设计与实…...

使用Python生成SVG图片

SVG(可缩放矢量图形)是一种基于XML的图像格式,它可以无损缩放且文件大小较小。在本文中,我们将探讨如何使用Python生成SVG图片。 为什么选择SVG? 可缩放:SVG图像可以无限放大而不失真。文件小:SVG文件通常比位图文件小。可编辑:SVG文件可以通过文本编辑器修改。 使用Python…...

hackmyvm-Hundred靶机

主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器&#xff0c;发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…...

多场景多任务建模(三): M2M(Multi-Scenario Multi-Task Meta Learning)

多场景建模: STAR(Star Topology Adaptive Recommender) 多场景建模&#xff08;二&#xff09;: SAR-Net&#xff08;Scenario-Aware Ranking Network&#xff09; 前面两篇文章&#xff0c;讲述了关于多场景的建模方案&#xff0c;其中可以看到很多关于多任务学习的影子&…...

Day31 || 122.买卖股票的最佳时机 II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和

122.买卖股票的最佳时机 II 题目链接&#xff1a;力扣题目链接 思路&#xff1a;因为是求虽大利润完全可以假设知道第二天涨前一天买入即可&#xff0c;就是求两天只差大于0 的和。 55. 跳跃游戏 题目链接&#xff1a;力扣题目链接 思路&#xff1a;应该从后往前循环判断&…...

【uniapp】打包成H5并发布

目录 1、设置配置mainifest.sjon 1.1 页面标题 1.2 路由模式 1.3 运行的基础路径 2、打包 2.1 打包入口 2.2 打包成功 2.3 依据目录找到web目录 3、 将web目录整体拷贝出来 4、上传 4.1 登录uniapp官网注册免费空间 4.2 上传拷贝的目录 4.3 检查上传是否正确 5、…...