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

C++语言系列-STL容器和算法

C++语言系列-STL容器

      • 容器类

本文将对C++语言中的标准模板库STL容器进行简单介绍,重点在于如何使用。

容器类

STL中的容器包括以下类别:

  • vector: 动态数组,底层基于数组来实现,在容量不足的时候能够自动进行扩容。
  • list: 链表
  • stack: 先进后出的栈
  • set: 基于红黑树实现的集合,插入或者查找的时间复杂度在 O ( n l o g n ) O(nlogn) O(nlogn)
  • unordered_set:基于哈希表实现的集合,插入或者查找的时间复杂度基本上在 O ( 1 ) O(1) O(1)
  • map: 基于红黑树实现,插入或者查找的时间复杂度在 O ( n l o g n ) O(nlogn) O(nlogn),性能相对稳定,且因为有序性可以支持范围查找
  • unordered_map: 基于哈希表实现,插入或者查找的时间复杂度基本上在 O ( 1 ) O(1) O(1),性能相对不稳定
  • queue:新进先出的单向队列
  • deque: 双端队列
  • priority_queue: 底层基于大顶堆或者小顶堆来实现,优先级队列,能够以 O ( l o g n ) O(logn) O(logn)的时间复杂度取出队列中所有的元素的最小值
  • string: 字符串

下面以代码的方式给出各种容器的使用方法,包括如何使用迭代器进行遍历,如何使用算法进行排序,如下:

/*多年刷题经验总结的stl常用的接口
*/
#include<iostream>
#include<vector>
#include<list>
#include<stack>
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>
#include<queue>  // 包括priority_queue
#include<deque>
#include<string>
#include<algorithm>
//  g++  -Wno-all  -o demo   stl.cpp
class Demo {
public:int A;Demo(){}Demo(int A) {this -> A = A;}
};struct Demo1
{bool operator()(const int &lhs, const int &rhs) const{ // 后面const修饰表示该函数为常成员函数,不会修改成员变量return lhs > rhs;}
};bool compare(const int &l1, const int &l2)
{return l1 > l2;
}void use_vector() {std::vector<int> v1;   // 空的vectorstd::vector<int> v2(3);  // 含有三个默认值的vectorstd::vector<int> v3(3, -1); // 三个值为-1的vectorstd::vector<std::vector<int>> v4 = {{1, 2}, {3, 4}};  // 二维数组// 获取元素数量, 所有容器通用, 调用的还有empty, 以及可以迭代操作的容器会有begin和end两个获取迭代器的通用函数int size = v3.size();  std::cout << "v3.size() = " << size << std::endl;v3[1] = 2;std::cout << "v3[1] = " << v3[1] << std:: endl;  // 通过[]直接读写对应位置的元素v3.push_back(1);  // 在某位添加元素v3.pop_back();   // 删除末尾的元素for (auto item: v3) {std::cout << item << std::endl;}// 排序, 倒排序std::sort(v3.begin(), v3.end(), compare);for (auto item: v3) {std::cout << item << std::endl;}
}void use_list() {std::list<int> l1;// 提供的api可以完美实现队列和双端队列l1.push_back(0);   // 尾部插入l1.push_back(1);l1.push_front(2);  // 头部插入l1.push_front(3);// 分别访问头部和尾部的元素std::cout << l1.front() << " " << l1.back() << std::endl;l1.pop_back();   // 尾部删除l1.pop_front();  // 头部删除,无返回值std::cout << l1.front() << " " << l1.back() << std::endl;
}void use_stack() {std::stack<int> s1;s1.push(-1);s1.push(-2);std::cout << s1.top() << std::endl;s1.pop();  // 无返回值std::cout << s1.top() << std::endl;
}void use_set()
{std::set<int> s1{1, 2};std::unordered_set<int> s2{3, 4};// set 和unordered_set 的查找和插入,删除操作是一样的if (s1.find(1) != s1.end()){ // 通过这种方式判断元素是否存在std::cout << "1 int s1" << std::endl;}s1.erase(1);if (s1.find(1) != s1.end()){std::cout << "1 int s1" << std::endl;}if (s2.find(1) != s2.end()){std::cout << "1 not int s2" << std::endl;}s2.insert(1);if (s2.find(1) != s2.end()){std::cout << "1 not int s2" << std::endl;}// 此外,基于有序,set还能提供以下两个函数auto it1 = s1.lower_bound(2); // 小于等于的元素对应的迭代器auto it2 = s1.upper_bound(1); // 大于元素对应的迭代器std::cout << *it1 << " " << *it2 << std::endl;
}void use_map()
{std::map<int, int> m1;std::unordered_map<int, int> m2;// 以下为两种类型的map都有的操作,直接通过[]读写元素m1[1] = -1;m2[0] = 1;m1.erase(1);auto it = m2.find(0);std::cout << it->second << std::endl;// 如何遍历for (auto it = m2.begin(); it != m2.end(); it++){std::cout << it->first << " " << it->second << std::endl;}
}void use_queue() {// 单向队列std::queue<int> q1;q1.push(-1);q1.push(-2);std::cout << q1.front() << std::endl;std::cout << q1.back() << std::endl;q1.pop();  // 无返回值std::deque<int> q2;q2.push_back(0);   // 尾部插入q2.push_back(1);q2.push_front(2);  // 头部插入q2.push_front(3);// 分别访问头部和尾部的元素std::cout << q2.front() << " " << q2.back() << std::endl;q2.pop_back();   // 尾部删除q2.pop_front();  // 头部删除,无返回值std::cout << q2.front() << " " << q2.back() << std::endl;// 重点关注优先级队列的创建,分别传入类型,底层容器(可选,默认vector),排序方式(可选,默认大顶堆)std::priority_queue<int, std::vector<int>, Demo1> q3;q3.push(37);q3.push(14);q3.push(559);q3.push(14);std::cout << q3.top() << std::endl;  // 打印最小数q3.pop();q3.pop();std::cout << q3.top() << std::endl; // 37// 介绍emplacestd::queue<Demo> q4;// emplace 原地构造对象,相比于push操作,push会先构造一个对象,然后调用拷贝构造函数或者移动构造函数在容器的对应位置构造一个,而emplace直接在容器的对应位置构造,效率更高q4.emplace(-1);
}void use_string() {char *str = "abcd";// 构造方法std::string s1 = std::string(4, 'c');  // "cccc"std::string s2 = std::string(str);  // 两种构造方法// 通过[]直接读写某个位置的字符s1[0] = 'b';std::cout << s1[0] << std::endl;std::string s3 = s1.append(s2);  // 拼接字符串std::cout << s3 << std::endl;int pos1 = s2.find("b", 1);  // 从字符串的1号位置往右查找第一个子串int pos2 = s1.rfind("c", 2); // 从字符串的2号位置往左查找第一个子串int ret = s1.compare(s2);  // 比较大小,大于返回1, 小于返回-1, 相等返回0std::string s4 = s1.substr(1, 2); // 截取从1号位置开始的后面两个字符作为子字符串std::cout << pos1 << " " << pos2 << " " << ret << " " << s4 << std::endl;
}int main() {std::cout << "test use vector" << std::endl;use_vector();std::cout << "test use list" << std::endl;use_list();std::cout << "test use stack" << std::endl;use_stack();std::cout << "test use set" << std::endl;use_set();std::cout << "test use map" << std::endl;use_map();std::cout << "test use queue" << std::endl;use_queue();std::cout << "test use string" << std::endl;use_string();return 0;
}

相关文章:

C++语言系列-STL容器和算法

C语言系列-STL容器 容器类 本文将对C语言中的标准模板库STL容器进行简单介绍&#xff0c;重点在于如何使用。 容器类 STL中的容器包括以下类别&#xff1a; vector: 动态数组&#xff0c;底层基于数组来实现&#xff0c;在容量不足的时候能够自动进行扩容。list: 链表stack: …...

【Web前端】Promise的使用

Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作&#xff0c;并提供了一种机制来处理该操作最终的成功或失败。具体来说&#xff0c;Promise是由异步函数返回的对象&#xff0c;能够指示该操作当前所处的状态。 当Promise被创建时&#xff0c;它会处于“待定”&a…...

TDK推出第二代用于汽车安全应用的6轴IMU

近日&#xff0c;据外媒报道&#xff0c;TDK株式会社推出用于汽车安全应用的第二代6轴 IMU&#xff0c;即为TDK InvenSense SmartAutomotive MEMS传感器系列增加了IAM-20685HP和IAM-20689&#xff0c;为决策算法提供可靠的运动数据&#xff0c;并实时准确地检测车辆动态。这对于…...

免费S3客户端工具大赏

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;S3免费客户端工具大赏 1. S3 GUI GitHub地址&#xff1a;https://github.com/aminalaee/s3gui 简介&#xff1a;S3 GUI 是一款基于 Flutter 构建的免费开源 S3 桌面客户端&#xff0c;支持桌面、移动和网络平台。 特…...

前端访问后端实现跨域

背景&#xff1a;前端在抖音里做了一个插件然后访问我们的后端。显然在抖音访问其他域名肯定会跨域。 解决办法&#xff1a; 1、使用比较简单的jsonp JSONP 优点&#xff1a;JSONP 是通过动态创建 <script> 标签的方式加载外部数据&#xff0c;属于跨域数据请求的一种…...

TCP和UDP通信基础

目录 1. 套接字 (Socket) 2. 基于TCP通信的流程 服务器端 客户端 1. TCP通信API 1.1 创建套接字描述符socket 1.2 绑定IP和端口号bind 1.3 设置监听状态 listen 1.4 接受连接请求 accept 1.5 发送数据 send 1.6 接收数据 recv 2. TCP服务器代码示例 代码解释&…...

微服务中的技术使用与搭配:如何选择合适的工具构建高效的微服务架构

一、微服务架构中的关键技术 微服务架构涉及的技术非常广泛&#xff0c;涵盖了开发、部署、监控、安全等各个方面。以下是微服务架构中常用的一些技术及其作用&#xff1a; 1. 服务注册与发现 微服务架构的一个重要特性是各个服务是独立部署的&#xff0c;因此它们的地址&am…...

找出字符串第一个匹配项的下标

找出字符串第一个匹配项的下标 题目描述&#xff1a; 题解思路&#xff1a; 图上所示&#xff0c;利用字符滑动&#xff0c;如果匹配就字符开始移动&#xff1b;如果不匹配成功&#xff0c;则停止移动&#xff0c;并回到字符串刚开始匹配的字符下标前一个&#xff0c;为下一次…...

面向FWA市场!移远通信高性能5G-A模组RG650V-NA通过北美两大重要运营商认证

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;其旗下符合3GPP R17标准的新一代5G-A模组RG650V-NA成功通过了北美两家重要运营商认证。凭借高速度、大容量、低延迟、高可靠等优势&#xff0c;该模组可满足CPE、家庭/企业网关、移动热点、高清视频…...

Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization, NGO&#xff09;是一种新颖的群智能优化算法&#xff0c;灵感源自北方苍鹰捕食时的策略。该算法通过模拟苍鹰的搜寻、接近和捕捉猎物的行为模式&am…...

搭建环境 配置编译运行 mpi-test-suite

1&#xff0c;编译安装 ucx 下载源码&#xff1a; $ git clone https://github.com/openucx/ucx.git $ ​git checkout v1.17.0 ​ 运行auto工具&#xff1a; $ ./autogen.sh $ ./autogen.sh 指所以运行两次是因为有时候第一次会失败&#xff0c;原因未查。 配置 ucx $ m…...

夜神模拟器启动报错:虚拟机启动失败 请进行修复 关闭hyper-v

不是关闭hyper-v的问题。 点那个没用。 解决办法&#xff1a; 我电脑win11&#xff08;win10 win11都一样 &#xff09;去安全中心-设备安全性 把内存完整性关了。 这还不够。 在右上角找系统信息 我发现VT显示没开 于是我去BIOS中开启VT 这个VT怎么开很简单。就是你F2 F1…...

投资策略规划最优决策分析

目录 一、投资策略规划问题详细 二、存在最优投资策略&#xff1a;每年都将所有钱投入到单一投资产品中 &#xff08;一&#xff09;状态转移方程 &#xff08;二&#xff09;初始条件与最优策略 &#xff08;三&#xff09;证明最优策略总是将所有钱投入到单一投资产品中…...

一篇保姆式虚拟机安装ubantu教程

前言&#xff1a; 本文将介绍在VMware安装ubantu&#xff0c;会的人可以试试上一篇介绍centos/ubantu安装docker环境,不同环境安装docker。一篇保姆式centos/unbantu安装docker 官网下载iso:Ubuntu 18.04.6 LTS (Bionic Beaver) 本次使用的版本是&#xff1a; 一&…...

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 &#xff08;一&#xff09;直观性的理解 &#xff08;二&#xff09;缓存区的好处 二、经典案例分析体会 &#xff08;一&#xff09;文件读写流&#xff08;File I/O Buffering&#xff09; BufferedOutputStream 和 BufferedWriter 可以加快…...

CentOS 7.9 搭建本地Yum源

yum&#xff08;Yellow Dog Updater&#xff0c;Modified&#xff09;是一个在Fedora、Centos、RedHat中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖关系&#xff0c;并且一次安装所有依赖的软件…...

【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)

本期目录 1 爬取思路 2 爬虫过程 2.1 网址 2.2 查看网页代码 3 爬取数据 3.1 导入包 3.2 爬取代码 01 爬取思路 \*- 第一步&#xff0c;获取页面内容\*- 第二步&#xff1a;解析并获取单个项目链接 \*- 第三步&#xff1a;获取子页面内容 \*- 第四步&#xff1a;解析…...

MATLAB和C++及Python流式细胞术

&#x1f335;MATLAB 片段 流式细胞术&#xff08;Flow Cytometry&#xff09;是一种用于分析细胞或其他颗粒悬浮在流动介质中的方法。MATLAB 可以用来处理和分析流式细胞术的数据&#xff0c;例如用于数据预处理、可视化和分析。以下是一些常见的 MATLAB 处理流式细胞术数据的…...

Vue3 pinia使用

Pinia 是一个现代的状态管理库&#xff0c;专为 Vue 3 设计。它提供了一种简单、直观的方式来管理应用中的全局状态 (就是不同组件都希望去共享的一些变量,函数等)。Pinia 的设计灵感来自于 Vuex&#xff08;Vue 2 的状态管理库&#xff09;&#xff0c;但进行了许多改进&#…...

tdengine学习笔记-建库和建表

目录 建库和建表 创建超级表​ 创建表​ 自动建表​ 创建普通表​ 多列模型 VS 单列模型​ 数据类型映射​ 示例程序汇总​ 在车联网领域的应用 1. 数据模型概述 2. 表结构设计 2.1 静态数据表 2.2 动态数据表 4. 查询数据 4.1 查询单个车辆的数据 4.2 查询多个…...

别再让时钟信号‘跑偏’了!手把手教你理解ADC中DCC电路的设计要点

高速ADC设计中的时钟占空比校正实战指南 时钟信号就像ADC系统的心跳&#xff0c;每一次跳动都决定着数据采样的精准度。当这个"心跳"变得不规律时&#xff0c;整个系统的性能就会大打折扣。在高速ADC设计中&#xff0c;时钟占空比失真是一个常见却又容易被忽视的问题…...

OpenClaw多模型切换技巧:GLM-4.7-Flash与Qwen3-32B混合调用实战

OpenClaw多模型切换技巧&#xff1a;GLM-4.7-Flash与Qwen3-32B混合调用实战 1. 为什么需要多模型切换 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动处理周报时&#xff0c;发现一个有趣的现象&#xff1a;用同一个模型处理文本摘要和代码片段时&#xff0c;效果差异很大…...

新手友好:通过快马用自然语言生成你的第一个openclaw卸载脚本

作为一个刚接触编程的新手&#xff0c;想要自己动手写一个软件卸载脚本确实会有点无从下手。最近我在学习Python时&#xff0c;发现用InsCode(快马)平台可以很轻松地通过自然语言描述生成完整代码&#xff0c;特别适合我们这样的初学者。下面我就分享一下如何用这个平台快速创建…...

Windows系统卡顿?一招禁用Microsoft Compatibility Telemetry释放CPU资源(附详细截图)

Windows系统卡顿终极解决方案&#xff1a;彻底禁用Microsoft Compatibility Telemetry 最近帮朋友处理一台老笔记本时&#xff0c;遇到了典型的Windows系统卡顿问题——风扇狂转、程序响应迟缓&#xff0c;任务管理器里一个叫"Microsoft Compatibility Telemetry"的进…...

TurboDiffusion应用场景探索:电商、教育、社交,AI视频如何赋能各行各业

TurboDiffusion应用场景探索&#xff1a;电商、教育、社交&#xff0c;AI视频如何赋能各行各业 1. 引言&#xff1a;AI视频生成的新纪元 想象一下这样的场景&#xff1a;早上9点&#xff0c;电商运营团队需要为100款新产品制作展示视频&#xff1b;下午2点&#xff0c;在线教…...

清音刻墨镜像免配置亮点:内置10+中文领域词典(医疗/法律/IT)开箱即用

清音刻墨镜像免配置亮点&#xff1a;内置10中文领域词典&#xff08;医疗/法律/IT&#xff09;开箱即用 1. 为什么字幕对齐需要专业词典&#xff1f; 做视频字幕的朋友都知道&#xff0c;最头疼的不是生成文字&#xff0c;而是让文字和声音完美对齐。普通字幕工具遇到专业术语…...

如何用NanoMsg的6种通信模式搞定分布式系统开发?附代码示例

如何用NanoMsg的6种通信模式构建高可靠分布式系统&#xff1f;实战代码解析 在分布式系统开发中&#xff0c;通信模式的选择往往决定了整个架构的扩展性和可靠性。NanoMsg作为轻量级高性能通信库&#xff0c;提供了6种经过验证的通信模式&#xff0c;每种都对应着特定的应用场景…...

League-Toolkit:革新英雄联盟体验的效率倍增工具集

League-Toolkit&#xff1a;革新英雄联盟体验的效率倍增工具集 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一…...

Win11Debloat:Windows系统轻量优化解决方案

Win11Debloat&#xff1a;Windows系统轻量优化解决方案 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和改善你的Win…...

SAP FICO财务账期管理实战:关键配置与月结操作指南

1. SAP FICO财务账期管理基础概念 财务账期管理是SAP FICO模块中最基础也最重要的功能之一。简单来说&#xff0c;它就像财务部门的"门禁系统"&#xff0c;控制着哪些会计凭证能在特定时间段被录入系统。想象一下&#xff0c;如果超市收银台没有营业时间限制&#xf…...