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容器进行简单介绍,重点在于如何使用。 容器类 STL中的容器包括以下类别: vector: 动态数组,底层基于数组来实现,在容量不足的时候能够自动进行扩容。list: 链表stack: …...
【Web前端】Promise的使用
Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作,并提供了一种机制来处理该操作最终的成功或失败。具体来说,Promise是由异步函数返回的对象,能够指示该操作当前所处的状态。 当Promise被创建时,它会处于“待定”&a…...
TDK推出第二代用于汽车安全应用的6轴IMU
近日,据外媒报道,TDK株式会社推出用于汽车安全应用的第二代6轴 IMU,即为TDK InvenSense SmartAutomotive MEMS传感器系列增加了IAM-20685HP和IAM-20689,为决策算法提供可靠的运动数据,并实时准确地检测车辆动态。这对于…...
免费S3客户端工具大赏
首发地址(欢迎大家访问):S3免费客户端工具大赏 1. S3 GUI GitHub地址:https://github.com/aminalaee/s3gui 简介:S3 GUI 是一款基于 Flutter 构建的免费开源 S3 桌面客户端,支持桌面、移动和网络平台。 特…...
前端访问后端实现跨域
背景:前端在抖音里做了一个插件然后访问我们的后端。显然在抖音访问其他域名肯定会跨域。 解决办法: 1、使用比较简单的jsonp JSONP 优点:JSONP 是通过动态创建 <script> 标签的方式加载外部数据,属于跨域数据请求的一种…...
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服务器代码示例 代码解释&…...
微服务中的技术使用与搭配:如何选择合适的工具构建高效的微服务架构
一、微服务架构中的关键技术 微服务架构涉及的技术非常广泛,涵盖了开发、部署、监控、安全等各个方面。以下是微服务架构中常用的一些技术及其作用: 1. 服务注册与发现 微服务架构的一个重要特性是各个服务是独立部署的,因此它们的地址&am…...
找出字符串第一个匹配项的下标
找出字符串第一个匹配项的下标 题目描述: 题解思路: 图上所示,利用字符滑动,如果匹配就字符开始移动;如果不匹配成功,则停止移动,并回到字符串刚开始匹配的字符下标前一个,为下一次…...
面向FWA市场!移远通信高性能5G-A模组RG650V-NA通过北美两大重要运营商认证
近日,全球领先的物联网整体解决方案供应商移远通信宣布,其旗下符合3GPP R17标准的新一代5G-A模组RG650V-NA成功通过了北美两家重要运营商认证。凭借高速度、大容量、低延迟、高可靠等优势,该模组可满足CPE、家庭/企业网关、移动热点、高清视频…...
Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 北方苍鹰优化算法(Northern Goshawk Optimization, NGO)是一种新颖的群智能优化算法,灵感源自北方苍鹰捕食时的策略。该算法通过模拟苍鹰的搜寻、接近和捕捉猎物的行为模式&am…...
搭建环境 配置编译运行 mpi-test-suite
1,编译安装 ucx 下载源码: $ git clone https://github.com/openucx/ucx.git $ git checkout v1.17.0 运行auto工具: $ ./autogen.sh $ ./autogen.sh 指所以运行两次是因为有时候第一次会失败,原因未查。 配置 ucx $ m…...
夜神模拟器启动报错:虚拟机启动失败 请进行修复 关闭hyper-v
不是关闭hyper-v的问题。 点那个没用。 解决办法: 我电脑win11(win10 win11都一样 )去安全中心-设备安全性 把内存完整性关了。 这还不够。 在右上角找系统信息 我发现VT显示没开 于是我去BIOS中开启VT 这个VT怎么开很简单。就是你F2 F1…...
投资策略规划最优决策分析
目录 一、投资策略规划问题详细 二、存在最优投资策略:每年都将所有钱投入到单一投资产品中 (一)状态转移方程 (二)初始条件与最优策略 (三)证明最优策略总是将所有钱投入到单一投资产品中…...
一篇保姆式虚拟机安装ubantu教程
前言: 本文将介绍在VMware安装ubantu,会的人可以试试上一篇介绍centos/ubantu安装docker环境,不同环境安装docker。一篇保姆式centos/unbantu安装docker 官网下载iso:Ubuntu 18.04.6 LTS (Bionic Beaver) 本次使用的版本是: 一&…...
缓冲区的奥秘:解析数据交错的魔法
目录 一、理解缓存区的好处 (一)直观性的理解 (二)缓存区的好处 二、经典案例分析体会 (一)文件读写流(File I/O Buffering) BufferedOutputStream 和 BufferedWriter 可以加快…...
CentOS 7.9 搭建本地Yum源
yum(Yellow Dog Updater,Modified)是一个在Fedora、Centos、RedHat中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件…...
【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)
本期目录 1 爬取思路 2 爬虫过程 2.1 网址 2.2 查看网页代码 3 爬取数据 3.1 导入包 3.2 爬取代码 01 爬取思路 \*- 第一步,获取页面内容\*- 第二步:解析并获取单个项目链接 \*- 第三步:获取子页面内容 \*- 第四步:解析…...
MATLAB和C++及Python流式细胞术
🌵MATLAB 片段 流式细胞术(Flow Cytometry)是一种用于分析细胞或其他颗粒悬浮在流动介质中的方法。MATLAB 可以用来处理和分析流式细胞术的数据,例如用于数据预处理、可视化和分析。以下是一些常见的 MATLAB 处理流式细胞术数据的…...
Vue3 pinia使用
Pinia 是一个现代的状态管理库,专为 Vue 3 设计。它提供了一种简单、直观的方式来管理应用中的全局状态 (就是不同组件都希望去共享的一些变量,函数等)。Pinia 的设计灵感来自于 Vuex(Vue 2 的状态管理库),但进行了许多改进&#…...
tdengine学习笔记-建库和建表
目录 建库和建表 创建超级表 创建表 自动建表 创建普通表 多列模型 VS 单列模型 数据类型映射 示例程序汇总 在车联网领域的应用 1. 数据模型概述 2. 表结构设计 2.1 静态数据表 2.2 动态数据表 4. 查询数据 4.1 查询单个车辆的数据 4.2 查询多个…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)
当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…...
使用 uv 工具快速部署并管理 vLLM 推理环境
uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...
