STL介绍及使用场景分析

一.总体介绍

STL(Standard Template Library)是C++标准模板库,提供了一系列的通用模板类和函数,用于实现常见的数据结构和算法,方便开发者快速地实现各种功能。STL包括了容器(Containers)、算法(Algorithms)和迭代器(Iterators)三个组件。

STL容器是STL中最重要的部分之一,提供了各种不同类型的数据结构,包括序列容器(如vector、list、deque等)、关联容器(如set、map、multiset、multimap等)和容器适配器(如stack、queue、priority_queue等)。每种容器都有不同的特点和适用场景,开发者可以根据具体需求选择合适的容器。

以下是STL中常用的容器及其简要介绍:

  1. vector:动态数组,支持随机访问和动态增删元素,适用于需要频繁访问元素的情况。
  2. list:双向链表,支持快速插入和删除元素,适用于频繁插入和删除元素的情况。
  3. deque:双端队列,支持在两端进行插入和删除操作,适用于需要在两端进行频繁插入和删除操作的情况。
  4. set/multiset:集合,元素按照一定规则排序,且元素不重复,适用于需要快速查找和去重的情况。
  5. map/multimap:映射,键值对存储,适用于需要快速查找和键值对存储的情况。
  6. stack:栈,后进先出的数据结构,适用于需要后进先出的情况。
  7. queue:队列,先进先出的数据结构,适用于需要先进先出的情况。
  8. priority_queue:优先队列,按照一定规则排序,每次取出的元素为最优先元素,适用于需要按照优先级取出元素的情况。

在选择STL容器时,需要根据具体的需求和情况进行选择,考虑以下因素:

  • 数据结构特点:不同的容器有不同的特点和适用场景,需要根据需求选择合适的数据结构。
  • 操作复杂度:不同的容器对于不同的操作有不同的时间复杂度,需要根据具体操作的频率选择合适的容器。
  • 内存占用:不同的容器在内存占用上也有不同,需要根据内存占用的要求选择合适的容器。

总的来说,STL容器提供了丰富的选择,开发者可以根据具体需求选择合适的容器,以实现高效的数据结构和算法。

二.使用方法 

1.vector

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};for (int i = 0; i < vec.size(); i++) {std::cout << vec[i] << " ";}return 0;
}

2.list 

#include <list>
#include <iostream>int main() {std::list<int> myList = {1, 2, 3, 4, 5};myList.push_back(6);myList.push_front(0);for (auto it = myList.begin(); it != myList.end(); it++) {std::cout << *it << " ";}return 0;
}

 3.deque

#include <deque>
#include <iostream>int main() {std::deque<int> myDeque = {1, 2, 3, 4, 5};myDeque.push_back(6);myDeque.push_front(0);for (int i = 0; i < myDeque.size(); i++) {std::cout << myDeque[i] << " ";}return 0;
}

4.set

#include <set>
#include <iostream>int main() {std::set<int> mySet = {3, 1, 4, 1, 5, 9};for (auto it = mySet.begin(); it != mySet.end(); it++) {std::cout << *it << " ";}return 0;
}

5.map

#include <map>
#include <iostream>int main() {std::map<std::string, int> myMap = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};for (auto it = myMap.begin(); it != myMap.end(); it++) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}

 6.stack

#include <stack>
#include <iostream>int main() {std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);while (!myStack.empty()) {std::cout << myStack.top() << " ";myStack.pop();}return 0;
}

 7.queue

#include <queue>
#include <iostream>int main() {std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);while (!myQueue.empty()) {std::cout << myQueue.front() << " ";myQueue.pop();}return 0;
}

三.优先队列介绍 

priority_queue 是一个优先队列容器,它基于堆数据结构实现,可以保证在插入和删除元素时,始终保持队列中的元素按照一定的优先级顺序排列。在 priority_queue 中,最优先的元素始终位于队列的顶部,可以通过 top() 方法获取最优先的元素。

priority_queue 提供了一些常用的操作,如插入元素 push()、删除最优先元素 pop()、获取最优先元素 top() 等。在 priority_queue 中,元素的优先级由比较函数或者元素类型的 < 操作符决定。

以下是 priority_queue 的一些重要特点和注意事项:

  • 默认情况下,priority_queue 是一个最大堆,即最大的元素位于队列的顶部。
  • 可以通过指定比较函数或者使用自定义的元素类型重载 < 操作符来实现最小堆。
  • priority_queue 不支持遍历操作,只能通过 top() 方法获取最优先元素,然后通过 pop() 方法删除该元素。
  • 插入和删除操作的时间复杂度为 O(log n),获取最优先元素的时间复杂度为 O(1)。

示例:

#include <queue>
#include <iostream>int main() {std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(3);myPriorityQueue.push(1);myPriorityQueue.push(5);while (!myPriorityQueue.empty()) {std::cout << myPriorityQueue.top() << " ";myPriorityQueue.pop();}return 0;
}

 在上面的示例中,我们创建了一个 priority_queue,并依次插入了元素 3、1、5。然后通过循环获取最优先元素并输出,最终输出结果为 5、3、1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1&#xff0c;发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

文本协议中嵌入二进制数据

在文本协议中嵌入二进制数据时&#xff0c;通常不推荐使用new String(byte[], Charset)&#xff0c;除非你确定这些字节实际上是以指定的字符集编码的文本。这是因为如果字节不是有效的文本编码&#xff0c;那么使用new String(byte[], Charset)可能会产生不可预测的结果&#…

VictoriaMetrics

概念 介绍 VictoriaMetrics&#xff0c;是一个快速高效、经济并且可扩展的监控解决方案和时序数据库 本文均用VM简称VictoriaMetric 作用 用于作为prometheus的长期储存方案&#xff0c;代替prometheus存储监控采集的数据 优点 远程存储&#xff1a;可作为单一或多个Pro…

【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论&#xff0c;有需要借鉴即可。 目录 1.二分查找1.1使用前提1.2模板 2.题目3.题解代码示例4.二分查找的一般模板5.总结 1.二分查找 1.1使用前提 使用的条件&#xff1a;数组具有“二段性”&#xff0c;二段性指的是数组可以根据某…

110份财务常用excel模板(个税、采购、报销、预算),超实用!

如果你还在为报表头疼&#xff0c;那你一定不能错过这篇干货满满的分享&#xff01; 个税报表 个人所得税&#xff0c;听起来就头大&#xff1f;别担心&#xff0c;掌握这些技巧&#xff0c;轻松搞定&#xff01; - 记录员工收入&#xff0c;确保数据准确无误 - 计算应纳税…

【Unity Shader入门精要 第7章】基础纹理(一)

1. 纹理映射 每一张纹理可以看作拥有一个属于自己的2D坐标空间&#xff0c;其横轴用U表示&#xff0c;纵轴用V表示&#xff0c;因此也称为UV坐标空间。 UV空间的坐标范围为[0&#xff0c;0]到[1&#xff0c;1]&#xff0c;在Unity中&#xff0c;UV空间也是从左下到右上&#…

测试萌新Python学习(五)接口自动化测试requests

requests 接口自动化测试requests库基本实现请求-GET基本实现请求-POST基本实现请求-补充 sessionCookie和Session案例params 接口自动化测试 概念程序驱动代替人工驱动去实现接口测试 实现方式 测试工具(jmeter, postman, …)编码工具(python, java, …) 比较 工具 优点:…

Network Compression

听课&#xff08;李宏毅老师的&#xff09;笔记&#xff0c;方便梳理框架&#xff0c;以作复习之用。本节课主要讲了Network Compression&#xff0c;包括为什么要压缩&#xff0c;压缩的主要手段&#xff08;pruning,knowledge distillation,parameter quantization,architect…

Elasticsearch_sql插件安装+使用

一、安装 前提是你先安装好了elasticseach&#xff0c;安装过程在我上一篇博客有说&#xff0c;可以看一下。 在elasticsearch容器启动的情况下&#xff0c;进入到elasticsearch容器&#xff0c;Elasticsearch_sql仓库&#xff0c;比如我的版本是8.11.2&#xff0c;那么我就选…

[蓝桥杯]真题讲解:抓娃娃(思维+二分)

[蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09;&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #d…

fastapi+vue实现导入Excel表格的功能

1.前端部分 1.1 api设置 // 导入用户 export function uploadUser(data) {const formData new FormData();formData.append(file, data); // data 是从文件上传事件中获取的文件对象return request({url: /users/upload,method: post,headers: {Content-Type: multipart/fo…

前端CSS3基础1(新增长度单位,盒子模型,背景,边框,文本属性,渐变,字体,2D变换,3D变换)

前端CSS3基础1&#xff08;新增长度单位&#xff0c;盒子模型&#xff0c;背景&#xff0c;边框&#xff0c;文本属性&#xff0c;渐变&#xff0c;字体&#xff0c;2D变换&#xff0c;3D变换&#xff09; CSS3 新增长度单位CSS3 新增盒子模型相关属性box-sizing怪异盒模型box-…

实现简易版Vuex

从实现一个简单的 Vuex 类来了解 Vuex 的工作原理。 实现思路 Vuex 下拥有 install 方法和 Store 类。即创建一个 Vuex 的模块&#xff0c;这个模块导出 install 方法和 Store 类。 install 方法 Vuex 是 Vue 的一个插件&#xff0c;所以需要实现 Vue 插件约定的 install 方…

Linux:ftp文件传输实验

Linux&#xff1a;ftp文件传输实验 实验实现 # 安装对应软件 [rootserver120 ~]# dnf install vsftpd -y [rootserver120 ~]# dnf install lftp -y# 关闭防火墙以及开启服务 [rootserver120 ~]# systemctl disable --now firewalld [rootserver120 ~]# systemctl enable --no…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主

【RAG 论文】UPR:使用 LLM 来做检索后的 re-rank

论文&#xff1a;Improving Passage Retrieval with Zero-Shot Question Generation ⭐⭐⭐⭐ EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 论文&#xff1a;Open-source Large Language Models are Strong Zero-shot Query…

【HR】阿里三板斧--20240514

参考https://blog.csdn.net/haydenwang8287/article/details/113541512 头部三板斧 战略能不能落地、文化能不能得到传承、人才能不能得到保障。 头部三板斧适用的核心场景有三个&#xff1a;一是战略不靠谱&#xff1b;二是组织效率低、不聚心&#xff1b;三是人才跟不上。对…

c++ 各版本特性介绍

c C是一种高级编程语言&#xff0c;以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的&#xff0c;作为C语言的一个扩展。C不仅包含了C语言的所有特性&#xff0c;还引入了面向对象编程&#xff08;OOP&#xff09;的概念&…

基于Vue3+ElementPlus项目,复制文字到剪贴板功能实践指南,揭秘使用js-tool-big-box工具库的核心优势

在前端开发项目中&#xff0c;很多时候有那么一个场景&#xff0c;就是要求将一段文案复制下来&#xff0c;这段文案可能是一串很长的id&#xff0c;可能是一条命令语句&#xff0c;可能是一小段文案&#xff0c;复制到剪贴板上。这样有利于用户复制到其他地方去&#xff0c;使…

自然资源-城乡规划行业未来二十年将何去何从?

自然资源-城乡规划行业未来二十年将何去何从? 城乡规划行业未来风口在以下几个方向&#xff0c;看好啦&#xff01;紧跟国家发展战略和政策背景。 1.大数据的城市规划应用。 包含:公共数据平台的搭建CIM&#xff0c;数据赋能治理&#xff0c;城市规划中大数据应用的研究 等…