【C++】STL容器详解【上】

news2024/9/17 7:32:03

目录

一、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的六大组件

这六大容器分别是:容器、算法、仿函数、迭代器、适配器、空间配置器。

  1. 容器:存放数据
  2. 算法:操作数据
  3. 迭代器:算法通过迭代器操作容器数据
  4. 仿函数:为算法提供更多的策略
  5. 适配器:为算法提供更多的接口
  6. 空间适配器:为算法和容器 动态分配、管理空间

三、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(); //返回队列的大小

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

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

相关文章

Unity Shader实现简单的各向异性渲染(采用各向异性形式的GGX分布)

目录 准备工作 BRDF部分 Unity部分 代码 实现的效果 参考 最近刚结束GAMES202的学习&#xff0c;准备慢慢过渡到GAMES103。GAMES103的作业框架为Unity&#xff0c;并没有接触过&#xff0c;因此准备先学一点Unity的使用。刚好101和202都是渲染相关的&#xff0c;因此先学习…

如何查看Mac的处理器架构‌‌是ARM还是x86

‌通过命令行查看Mac的处理器架构‌‌ 打开终端&#xff08;Terminal&#xff09;。输入命令 uname -m 并回车。如果输出结果是 arm64&#xff0c;则表示你的Mac使用的是ARM架构&#xff1b;如果输出结果是 x86_64&#xff0c;则表示你的Mac使用的是x86架构。 如图&#xff1…

牛客JZ36 二叉搜索树与双向链表 C++

牛客JZ36 二叉搜索树与双向链表 C 思路&#x1f9d0;&#xff1a; 由图所示&#xff0c;我们看出该链表走的是中序&#xff0c;所以我们可以使用中序遍历的方式来解决这个问题&#xff0c;在遍历过程中&#xff0c;我们创建一个前驱和一个后继结点&#xff0c;来进行链接。 并且…

基于stm32f407的跟随行驶系统项目报告(利用openmv+超声波模块)

2023年全国大学生电子设计竞赛&#xff08;TI杯&#xff09; 2024年05月29日 摘要 本项目的硬件结构&#xff1a;基于STM32F407芯片为主控芯片&#xff0c;由TB6612电机驱动&#xff0c;控制左右轮电机的转动控制小车提供前进前进的速度&#xff0c;通过控制两轮的差数达到稳定…

Hive中的分区表与分桶表详解

目录 分区表和分桶表 分区表 分区表基本语法 1. 创建分区表 2. 分区表读写数据 1&#xff09;写数据 &#xff08;1&#xff09;LOAD &#xff08;2&#xff09;INSERT 2&#xff09;读数据 3. 分区表基本操作 1&#xff09;查看所有分区信息 2&#xff09;增加分区 …

数据库MySQL零基础-下【详细】

目录 六、事务/视图/触发器/存储过程 1、事务的理解 &#xff08;1&#xff09;事务的理解 &#xff08;2&#xff09;事务的特性 2、事务的应用 &#xff08;1&#xff09;事务的开启与提交 # 语法 # 示例 &#xff08;2&#xff09;开启autocommit&#xff08;临时生…

MybatisPlus静态工具 通用枚举

静态工具 有的时候Service之间也会相互调用&#xff0c;为了避免出现循环依赖问题&#xff0c;MybatisPlus提供一个静态工具类&#xff1a;Db&#xff0c;其中的一些静态方法与IService中方法签名基本一致&#xff0c;就在方法例多给出一个参数&#xff0c;操作的实体类类型。…

P3285 [SCOI2014] 方伯伯的OJ

*原题链接* 本题与NOIP2017列队有很多共通之处&#xff0c;都是一开始给我们一个排好编号的队列&#xff0c;然后进行一些操作。 如果n的范围不大&#xff0c;我们会如何做呢&#xff1f;很容易想到权值线段树&#xff0c;以编号为下标建立权值线段树&#xff0c;维护每个下标…

WEB攻防-ASP安全MDB下载植入IIS短文件名写权限解析

知识点&#xff1a; 1、ASP环境搭建组合&#xff1b; 2、ASP-数据库下载&植入&#xff1b; 3、IIS-短文件&解析&写权限&#xff1b; WEB安全攻防 1、web源码&#xff1b; 2、开发语言&#xff1b; 3、中间件平台&#xff1b; 4、数据库类型&#xff1b; 5、…

百度快照劫持之JS劫持诊断与恢复一例

劫持现象&#xff1a; 百度搜索结果中&#xff0c;被劫持网站出现在搜索结果中&#xff0c; 点击进入网站&#xff0c;网站显示正常&#xff0c;数秒后网站自动跳转到彩票网站f51688.com/ff6/。但是第二次点击搜索结果&#xff0c;正常进入网站缺不会跳转到彩票网站。 初步认…

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理&#xff0c;打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名…

GO语言快速入门(比较乱)

一、环境安装 1、安装Go环境 1、官网下载 2、cmd-->go version 3、环境变量 GOROOT&#xff1a;go安装路径 GOPATH&#xff1a;go存放代码的路径 4、GOWorks新建三个文件 5、go env查看配置 2、安装编辑器 GoLand或者VSCode 3、HelloWorld package main //一个程序只有一个…

设计模式学习[5]---装饰模式

文章目录 前言1. 原理阐述2. 举例2.1 人装饰方案一2.2 人装饰方案二2.3 人装饰方案三 总结 前言 近期在给一个已有的功能拓展新功能时&#xff0c;基于原有的设计类图进行讨论。其中涉及到了装饰模式&#xff0c;因为书本很早已经看过一遍&#xff0c;所以谈及到这个名词的时候…

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统&#xff0c;并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址&#xff08;Addressable&#xff09;时&#xff0c;您可以使用该资源的地址从任何地方加载它。无论资源是在…

php转职golang第二期

以下是一份简单的 Go 基本语法笔记&#xff1a; 变量与常量&#xff1a; • var 声明变量。• const 声明常量。数据类型&#xff1a; • 整型、浮点型、布尔型、字符串型等。流程控制&#xff1a; • if-else 语句。• for 循环。函数&#xff1a; • 定义和调用函数。数…

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接&#xff1a;394. 字符串解码 1- 思路 栈实现四种情况处理 ① 遇到数字&#xff0c;进行倍数相加 、②遇到左括号&#xff0c;压栈之前的元素、③遇到右括号弹出&#xff0c;栈进行…

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation&#xff08;属性编辑&#xff09;、disentanglement&#xff08;解纠缠&#xff09;常用的两种做法&#xff1a;线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中&#xff0c;有一种非常简单的方法来引导G向某个方向进行生成&…

【Android】使用和风天气API获取天气数据吧!(天气预报系列之一)

【Android】使用和风天气API获取天气数据吧&#xff01;&#xff08;天气预报系列之一&#xff09; 古话说得好&#xff0c;要有天气预报&#xff0c;首先需要有天气&#xff0c;和预报。 今天给大家介绍一个好用的天气预报API&#xff1a;和风天气。以及webAPI的使用方法~&a…

【H2O2|全栈】关于HTML(3)HTML基础(二)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类&#xff08;二&#xff09; 本文中的标签在什么位置使用&#xff1f; 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…