【C++】STL容器详解【上】
目录
一、STL基本概念
二、STL的六大组件
三、string容器常用操作
3.1 string 容器的基本概念
3.2 string 容器常用操作
3.2.1 string 构造函数
3.2.2 string基本赋值操作
3.2.3 string存取字符操作
3.2.4 string拼接字符操作
3.2.5 string查找和替换
3.2.6 string比较操作
3.2.7 string子串
3.2.8 string插入和删除操作
3.2.9 string和c-style字符串转换
3.3 vector容器
3.3.1 vector容器概述
3.3.2 Vector的数据结构
3.3.3 vector构造函数
3.3.4 vector常用赋值操作
3.3.5 vector大小操作
3.3.6 插入和删除元素操作
3.3.7 巧用swap收缩内存空间
3.4 deque容器
3.4.1 deque基本概念
3.4.1 deque构造函数
3.4.2 deque赋值操作
3.4.3 deque大小操作
3.4.4 deque双端插入和删除操作
3.4.5 deque数据存取
3.4.6 deque插入操作
3.4.7 deque删除操作
3.5 stack容器
3.5.1 stack的基本概念
3.5.2 stack构造函数
3.5.3 stack赋值操作
3.5.4 stack数据存取操作
3.5.5 stack大小操作
3.6 queue容器
3.6.1 queue基本概念
3.6.2 queue常用的API
一、STL基本概念
STL几乎所的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
二、STL的六大组件
这六大容器分别是:容器、算法、仿函数、迭代器、适配器、空间配置器。
- 容器:存放数据
- 算法:操作数据
- 迭代器:算法通过迭代器操作容器数据
- 仿函数:为算法提供更多的策略
- 适配器:为算法提供更多的接口
- 空间适配器:为算法和容器 动态分配、管理空间
三、string容器常用操作
3.1 string 容器的基本概念
char * 是一个指针,string是一个类
string封装了char *,管理这个字符串,是一个char型的容器。
String封装了很多实用的成员方法:查找(find)、拷贝(copy)、替换(replace)、插入(insert)
不用考虑内存的释放和越界问题:string管理char *所分配的内存,每一次string的复制,取值都由string类负责维护,不用担心复制越界和取取值越界等。
3.2 string 容器常用操作
3.2.1 string 构造函数
string(); // 创建一个空字符串
string(const string & str); // 使用一个string对象初始化另一个string对象
string(const char* s); // 使用一个字符串s初始化
string(int n, char c); //使用n个字符串c初始化
3.2.2 string基本赋值操作
string& operator=(const char *s); // char*类型字符串 赋值给当前字符串
string& operator=(const string &s); // 把字符串s赋给当前字符串
string& operator=(char c); // 字符赋值给当前字符串
string& assign(const char *s); // 把字符串s赋给当前字符串
string& assign(const char *s, int n); // 把字符串s的前n个字符赋给当前字符串
string& assign(cosnt string &s); // 把字符串s赋给当前字符串
string& assign(int n, int c); // 用n个字符c赋给当前字符串
string& assign(const string &s, int start, int n); // 将s从start开始n个字符赋给当前字符串
3.2.3 string存取字符操作
char& operator[](int n); // 通过[]方式获取字符
char& at(int n); // 通过at方法获取字符
//[] 越界不会抛出异常 at方法 越界会抛出异常
3.2.4 string拼接字符操作
string& operatir+=(const string& str); // 重载+=操作符
string& opreator+=(const char* str); // 重载+=操作符
string& operator+=(const char c); // 重载+=操作符
string& append(const char *s); // 把字符串s连接到当前字符串的结尾
string& append(const char *s, int n); // 把字符串s的前n个字符串连接到当前字符串结尾
string& append(const string &s); // 同operator+=()
string& append(const string &s, int pos, int n); // 把字符串中从pos位置开始的n个字符连接到当前字符串·结尾
string& append(int n, char c); // 载当前字符串结尾添加n个字符c
3.2.5 string查找和替换
int find(const string& str, int pos = 0)const; // 查找str第一次出现的位置,从pos开始查找
int find(const char* s, int pos = 0)const; // 查找s第一次出现的位置,从pos开始查找
int find(const char* s, int pos, int n)const; // 从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos); // 查找字符串c第一次出现位置
int rfind(const string& str, int pos = npos)const; // 查找str最后一次位置,从pos位置开始找
int rfind(const char* s, int pos = npos)const; // 查找s最后一次出现的位置,从pos位置开始找
int rfind(const char* s, int pos, int n); // 从pos查找s的前n个字符最后一次出现的位置
int rfins(const char c, int pos); // 查找字符c最后一次出现的位置
string& replace(int pos, int n, const string& str); // 替换从pos开始n各字符为字符串str
string& replace(int pos, int n, const char* s); // 替换从pos开始的n各字符为字符串
3.2.6 string比较操作
/*
compare函数在>时返回 1, <时返回 -1, ==时返回 0
比较区分大小写,比较时参考字典顺序,排越前面的越小
大写的A比小写的a小
*/
int compare(const string &s)const; // 与字符串s比较
int compare(const char *s)const; // 与字符串s比较
3.2.7 string子串
string substr(int pos = 0, int n =npos)const; //返回由pos开始的n个字符组成的字符串
3.2.8 string插入和删除操作
string& insert(int pos, const char* s); // 插入字符串
string& insert(int pos, const string& str); // 插入字符串
string& insert(int pos, int n, char c); // 在指定位置插入n个字符c
string& erase(int pos, int n=npos); // 删除从pos开始的n个字符
3.2.9 string和c-style字符串转换
// string 转 char*
string str = "itcast";
const char* cstr = str.c_str();
// char* 转 string
char* s = "itcast";
string str(s);
3.3 vector容器
3.3.1 vector容器概述
vector的数据安排及操作方式,与array非常相似,两者的唯一差别在于空间运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎的由自己来,首先配置一块新的空间,然后将旧的空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此,vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector旧空间满了,如果客户每新增一个元素,vector内部知识扩充一个元素的空间,实为不智。
v.begin():获取容器的起始迭代器(指向第0个元素)
v.end():获取容器的结束迭代器(指向最后一个元素的下一个位置)
3.3.2 Vector的数据结构
3.3.3 vector构造函数
vector<T> v; // 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end()); // 将v[begin(), end()]区间中的元素拷贝给本身
vector(n, elem); // 构造函数将n个elem拷贝给本身
vector(const vector & vec); //拷贝构造函数
3.3.4 vector常用赋值操作
assign(begin, end); // 将[begin, end)区间中的数据拷贝赋值给本身
assign(n, elem); // 将n个elem拷贝赋值给本身
vector& operator=(const vector &vec); // 重载等号操作符
swap(vec); //将vec与本身的元素互换
3.3.5 vector大小操作
size(); //返回容器中元素的个数
empty(); //判断容器是否为空
resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
resize(int num, elem); //重新指定容器的长度为num, 若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器部分被删除
capacity(); //容器的容量
reserve(int len); //容器预留 len个元素长度,预留位置不初始化,元素不可访问
3.3.6 插入和删除元素操作
insert(const_iterator pos, int count, ele); //迭代器指向位置pos插入count个元素
push_back(ele); //尾部插入元素ele
pop_back(); //删除最后一个元素
erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素
erase(const_iterator pos); // 删除迭代器指向的元素
clear(); //删除容器中所有元素
3.3.7 巧用swap收缩内存空间
vector<int> v1;
v1.reserve(1000);
v1.push_back(10);
v1.push_back(10);
v1.push_back(10);
v1.push_back(10);
cout<<"容量:"<<v1.capacity()<<", 大小:"<<v1.size()<<endl; // 1000 4
// resize只能修改大小,不能修改容量
// v1.resize(4);
vector<int>(v1).swap(v1);
cout<<"容量:"<<v1.capacity()<<", 大小:"<<v1.size()<<endl; // 4 4
3.4 deque容器
3.4.1 deque基本概念
vector容器时单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思就是可以再头尾两端分别做元素的加入和删除操作,当然,vector容器也可以再头尾两端插入元素,但是在其头部操作效率奇差,无法被接收。
3.4.1 deque构造函数
deque<T> depT; //默认构造形式
deque(begin, end); // 构造函数将[begin, end)区间和zoo那个的元素拷贝给本身
deuqe(n, elem); // 构造函数将n个elem拷贝给本身
deque(const deque *deq); //拷贝构造函数
3.4.2 deque赋值操作
assign(begin, end); //将[begin,end)区间的数据拷贝赋值给本身
assign(n, elem); //将n个elem拷贝赋值给本身
deque& operator=(const deque &deq); //重载等号操作符
swap(deq); //将dep与本身的元素互换
3.4.3 deque大小操作
deque.size(); //返回容器中元素的个数
deque.empty(); //判断容器是否为空
deque.resize(num); //重新指定容器的长度为num, 若容器边长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度元素将被删除
deque.resize(num, elem); //重新指定容器的长度为num, 若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度元素将被删除
3.4.4 deque双端插入和删除操作
push_back(elem); //在容器尾部添加一个数据
push_front(elem); //在容器头部添加一个数据
pop_back(); //删除容器最后一个数据
pop_front(); //删除容器第一个数据
3.4.5 deque数据存取
at(idx); //返回索引idx所指的数据,如果idx越界,抛出cout_of_range
operator[]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错
front(); //返回第一个数据
back(); //返回最后一个数据
3.4.6 deque插入操作
insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值
insert(pos, beg, end); //在pos位置插入[begin, end)区间的数据,无返回值
3.4.7 deque删除操作
clear(); //移除容器中的所有元素
erase(begin, end); //删除[begin, end)区间的数据,返回下一个数据的位置
erase(pos); //删除pos位置的数据,返回下一个数据的位置
3.5 stack容器
3.5.1 stack的基本概念
stack是一种先进后厨的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许遍历行为。由元素推入栈的操作成为push,将元素推出stack的操作称作pop.
3.5.2 stack构造函数
stack<T> stkT; //stack 采用模板类实现, stack对象默认构造方式
stack(const stack &stk); //拷贝构造函数
3.5.3 stack赋值操作
stack& operator=(const stack &stk); //重载等号操作符
3.5.4 stack数据存取操作
push(elem); //向栈顶添加元素
pop(); //从栈顶移除元素
top(); //返回栈顶元素
3.5.5 stack大小操作
empty(); // 判断堆栈是否为空
size(); //返回堆栈的大小
3.6 queue容器
3.6.1 queue基本概念
Queue是一种先进先出的数据结构。它有两个出口,queue容器允许从一段新增元素,从另一端移除元素。
3.6.2 queue常用的API
queue<T> queT; //queue采用模板类实现,queue对象的默认构造形式
queue(const queue &que); //拷贝构造函数
push(elem); //往队尾中添加一个元素
pop(); //从队头移除一个元素
back(); //返回最优一个元素
front(); //返回第一个元素
queue& operator=(const queue &qye); //重载等号操作符
empty(); //判断队列是否为空
size(); //返回队列的大小
相关文章:

【C++】STL容器详解【上】
目录 一、STL基本概念 二、STL的六大组件 三、string容器常用操作 3.1 string 容器的基本概念 3.2 string 容器常用操作 3.2.1 string 构造函数 3.2.2 string基本赋值操作 3.2.3 string存取字符操作 3.2.4 string拼接字符操作 3.2.5 string查找和替换 3.2.6 string比…...

助贷行业的三大严峻挑战:贷款中介公司转型债务重组业务
大家是否察觉到一种趋势?现如今,众多贷款辅助服务机构与专注于债务再构的公司之间形成了紧密的“联动”。有的选择将获取的贷款需求转介给债务重组方,有的则直接下场,动用自身资本参与债务重组业务。这一现象背后,究竟…...

力扣第42题 接雨水
前言 记录一下刷题历程 力扣第42题 接雨水 接雨水 原题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…...

轻松录制每一刻:探索2024年免费高清录屏应用
你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/R…...

【小沐学OpenGL】Ubuntu环境下glfw的安装和使用
文章目录 1、简介1.1 OpenGL简介1.2 glfw简介 2、安装glfw2.1 直接命令二进制安装2.2 源码安装 3、测试glfw3.1 测试1,glfwglew3.2 测试2,glfwglad3.3 测试3 结语 1、简介 1.1 OpenGL简介 OpenGL作为图形界的工业标准,其仅仅定义了一组2D和…...

[数据集][目标检测]汽油检泄漏检测数据集VOC+YOLO格式237张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):237 标注数量(xml文件个数):237 标注数量(txt文件个数):237 标注类别…...

图文解析保姆级教程:Postman专业接口测试工具的安装和基本使用
文章目录 1. 引入2. 介绍3. 安装4. 使用 此教程摘选自我的笔记:黑马JavaWeb开发笔记16——请求(postman、简单参数、实体参数、RequestParam映射)想要详细了解更多有关请求各种参数介绍的知识可以移步此篇笔记。 1. 引入 在当前最为主流的开…...

jenkins配置流水线
新建任务,随便选一个名字,选中流水线 配置git的用户名和密码,记录ID,后面配置流水线的时候用。 pipeline {agent anystages {stage(stop app){steps {script {def remote [:]//配置服务地址,用户名和密码remote.na…...

SQL 编程基础
SQL(结构化查询语言)广泛应用于数据库操作,是每个程序员都需要掌握的技能之一。这篇文章将带你从基础入门,了解SQL编程中的常量、变量及流程控制语句。我们将采用简单易懂的语言,结合实际示例,帮助你轻松理…...

sql 中名字 不可以 包含 mysql中 具有 特定意义 的单词
这种sql执行不报错 这种sql执行报错 所以sql中名字不可以使用mysql中具有特定意义的单词 以此文章作为警告,我下次起名字不可以使用 mysql中具有特殊意义的字符 就因为这个导致我搞了一个多小时,急死我了,周五就要前后端联调了。下次千万不…...

分布式部署①
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 1. 需要部署的服务 Nacos 理论上,应…...

开源可视化大屏superset Docker环境部署
superset 开源可视化大屏Docker环境部署 前言 superset是俄罗斯开源的一款可视化大屏,用于数据可视化探索,含有丰富的图表组件,可以支持接入各种数据源。 接触superset就是想体验下可视化大屏功能,想最快速度安装成功ÿ…...

tomato靶场通关攻略
1.御剑2014找到IP地址 2.dirb扫描目录 3.再次详细扫描目录 4.访问找到的目录文件 进入antibots中 5.搜寻一会再info.php里面发现有东西 6.这个地方貌似可以进行利用 7.查看源代码发现包含include文件上传漏洞 8.网址后面跟?image../../../../../../../etc/passwd 9.既然可以查…...

【Spring Boot 3】【Web】处理跨域资源共享 CORS
【Spring Boot 3】【Web】处理跨域资源共享 CORS 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术…...

HUAWEI华为MateBook B5-420 i5 集显(KLCZ-WXX9,KLCZ-WDH9)原装出厂Windows10系统文件下载
适用型号:KLCZ-WXX9、KLCZ-WDH9 链接:https://pan.baidu.com/s/12xnaLtcPjZoyfCcJUHynVQ?pwdelul 提取码:elul 华为原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、华为浏览器、Office办公软件、华为…...

算法练习题10:leetcode76最小覆盖子串-滑动窗口
目录 题目 题目描述 约束条件 解决思路 代码 getOrDefault(c, 0) 方法 方法签名 参数 返回值 示例 getOrDefault 与 get 的主要区别 Integer 题目 题目描述 给定两个字符串 s 和 t,请你在字符串 s 中找到包含 t 中所有字符的最小子串。 要求…...

Svn常用操作技巧详细说明
TortoiseSVN是一个Windows操作系统下的Subversion客户端,它为用户提供了直观易用的界面,方便进行版本控制操作。下面是一些TortoiseSVN的常用操作技巧的详细说明: 检出代码: 在Windows资源管理器中,选择一个空文件夹&a…...

六、MySQL高级—架构介绍(1)
🌻🌻 目录 一、Mysql 简介1.1 概述1.2 Mysql 高手是怎样炼成的 二、Mysql Linux 版的安装2.1 mysql5.52.2 mysql5.7 三、Mysql 的用户与权限管理3.1 MySQL的用户管理3.2 权限管理3.3 通过工具远程访问 四、 Mysql的一些杂项配置(了解)五、 Mysql 逻辑架构…...

TensorRT-For-YOLO-Series项目:实现yolov10模型的python-tensorrt推理(对比int8与fp16推理差异)
项目地址:https://github.com/Linaom1214/TensorRT-For-YOLO-Series/tree/cuda-python 算法支持状态: 2024.6.16 Support YOLOv9, YOLOv10, changing the TensorRT version to 10.0 2023.8.15 Support cuda-python 2023.5.12 Update 2023.1.7 support YO…...

码上君量化互助社群介绍
写在前面 量化投资是一个漫长的过程,一个人单打独斗会走很多弯路,所以建立一个交流沟通互助群是有必要的。 无论是加入我的这个量化互助社群,还是加入其他的社群,首先要想想自己加入社群的目的是什么,自己想从中获得…...

Qt使用小技巧之按钮动态变化
前言 最近写小demo中无意发现的,是想实现当鼠标悬停到按钮上面的时候,按钮实现动态变化,让人知道鼠标经过了按钮,效果如下 hoverDynamicPushButton 正文 首先是将按钮的边框给去掉,然后设置下它的悬停伪状态就行了 格…...

MySQL——事务与存储过程(三)存储过程的使用(1)调用存储过程
使用存储过程可以使程序执行效率更高、安全性更好,增强程序的可重用性和维护性。接下来将针对存储过程的使用进行详细的讲解。 存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库…...

基于VUE2-dataV和echarts实现的可视化大屏,百分比适配PC端
可视化平台中,数据分别通过仪表盘、环状图、柱形图、曲线图、 滚动表格等多种形式展示数据变化。 可视化平台大致分为左、中、右三部分,左侧由能耗总览、耗能 占比、库存预警构成,中间由数据总览、销售计划完成率构成,右侧 由销售…...

FastAPI模块化:为复杂应用程序提供清晰的结构
开题描述: 在现代软件开发中,随着应用程序规模的扩大和功能的增加,传统的单体架构逐渐暴露出其局限性。FastAPI,作为一款高性能的现代Web框架,通过其模块化设计提供了一种解决方案。本文将探讨FastAPI模块化如何为构建…...

【Hot100】LeetCode—215. 数组中的第K个最大元素
目录 1- 思路快速选择 2- 实现⭐215. 数组中的第K个最大元素——题解思路 3- ACM实现 原题连接:215. 数组中的第K个最大元素 1- 思路 快速选择 第 k 大的元素的数组下标: int target nums.length - k 1- 根据 partition 分割的区间来判断当前处理方式…...

pycharm如何安装selenium
在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…...

css三点闪烁(可用于加载样式、标题等)
代码案例 HTML <div class"flexAlign loading"><div class"loading_item"></div><div class"loading_item"></div><div class"loading_item"></div> </div> <div class"ot…...

支持向量机 (Support Vector Machines, SVM)
支持向量机 (Support Vector Machines, SVM) 通俗易懂算法 支持向量机(SVM)是一种用于分类和回归任务的机器学习算法。在最简单的情况下,SVM是一种线性分类器,适用于二分类问题。它的基本思想是找到一个超平面(在二维…...

上海市计算机学会竞赛平台2024年8月月赛丙组调和级数
题目描述 给定一个整数 nn,记 ⌊x⌋⌊x⌋ 表示不超过实数 xx 的最大整数,请求出 ⌊n1⌋⌊n2⌋⌊n3⌋⋯⌊nn−1⌋⌊nn⌋⌊1n⌋⌊2n⌋⌊3n⌋⋯⌊n−1n⌋⌊nn⌋ 输入格式 单个整数:表示 nn 输出格式 单个整数:表示答…...

【重学 MySQL】二十、运算符的优先级
【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级(由高到低)注意事项示例 在 MySQL 中,运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…...