STL标准模板库---容器篇(一)

STL(Standard Template Library)是C++的一套功能强大的 C++ 模板类和函数的集合,它提供了一系列通用的、可复用的算法和数据结构。

STL 的设计基于泛型编程,这意味着使用模板可以编写出独立于任何特定数据类型的代码。

STL 分为多个组件,包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(Function Objects)和适配器(Adapters)等。

本节我们浅浅的介绍STL的容器部分,目前情况先学会如何使用,之后数据结构与C++语法的学习过程中逐渐思考如何模拟实现。


前言:字符串

1.字符串std::string

对C风格字符串的封装,也是容器类的“先驱”类,也可以称为“实验品”,但这只是相对而言。字符串类string本身功能还是非常强大的。

#include <iostream>
#include <string>
using namespace std;string str;//声明字符串变量
string str2="123";//初始化字符串变量string s1="hello";
string s2="stark";
string s3=s1+s2;//使用重载后的操作符 + 连接两个字符串

字符串类还提供了许多成员函数来操作字符串,以下是一些常用的成员函数:

size():返回字符串的长度

empty():检查字符串是否为空

substr():获取子字符串

find():查找子字符串在主字符串中的位置

replace():替换字符串中的某些字符

operator[]:通过索引访问字符串中的字符。(下标访问:使用时变量名相当于数组名)

一、数组容器

1.定长数组容器std::array

定长数组容器是C++标准库(STL)中的一个模板类,它定义在<array>头文件中。该模板类提供了一个固定大小的数组,其大小在编译时确定,并且不允许动态改变。与C语言的数组相比,具有更好的类型安全和内存管理特性。(C++11标准引入)

基本语法:

#include <array>std::array<T , N> arrat_name;

 T是数组中元素的类型,N是数组的大小,必须是一个非负整数。

提供的接口:

如size()、at()、front()、back()等

2.动态数组容器std::vector

vector是变长数组,支持随机访问,不支持在任意位置插入,为了保证效率,元素的增删一般在末尾进行。这样保证了方法的时间复杂度为O(1)。在<vector>头文件中。

基本语法:

#include <vector>std::vector<T> vec_name;//声明一个T类型数组,长度动态变化
std::vector<T> vec_name[size];//声明一个T类型二维数组,第一维长size,第二维动态变化struct myType{...};
std::vector<myType> vec_name;//自定义结构体类型也可以存放在vector中

内置函数:

size():返回容器的实际长度(包含的元素个数)。O(1)

empty():返回一个bool值,表明vector是否为空。O(1)

clear():把vector清空

frond():返回容器第一个元素,等价于a[0]和*(a.begin())

back():返回容器最后一个元素,等价于a[a.size()-1]和*(a.end())

push_back():push_back(x)把元素x插入到vector的尾部

pop_back():删除vector的最后一个元素

二、队列容器

1.队列容器std::queue

队列是一种先进先出(FIFO, First In First Out)的数据结构,它允许在一端添加元素(称为队尾),并在另一端移除元素(称为队首)。队列是一种线性数据结构,它遵循以下规则:

1.元素只能从队尾添加。2.元素只能从队首移除。

基本语法:

#include <queue>// 声明队列
queue<T> q;

基本操作:

empty(); //检查队列是否为空。
size();//返回队列中的元素数量。front(); //返回队首元素的引用。
back(); //返回队尾元素的引用。push(); //在队尾添加一个元素。
pop(); //移除队首元素。

2.双端队列容器std::deque

C++ 容器类 <deque> | 菜鸟教程

3.优先队列容器std::priority_queue

C++ 容器类 <priority_queue> | 菜鸟教程

三、链表容器

1.双向链表容器std::list

list是一种将数据进行链式存储的数据结构,被称为链表。链表由一个存储数据元素的数据域和一个存储下一个结点地址的指针域组成

基本语法:

#include <list>list<T> lst;//默认构造,只声明一个存储T类型的链表容器
list(begin,end);//构造函数,利用迭代器实现区间赋值
list(n,elem);//构造函数,将n个elem赋值给本身
list(const list &list);//拷贝构造

 list的赋值

函数原型
.list& operator=(const list& lst);//赋值运算符重载
.assign(begin,end);//利用迭代器实现区间赋值
.assign(n,elem);//将n个elem赋值给本身
.swap(lst);//将另一个lst与本身进行互换

list的数据获取

.front();//返回容器第一个元素
.back();//返回容器最后一个元素

list的大小操作

函数原型:
.size();//返回容器中有效元素个数
.empty();//判断容器是否为空
.resize(num);//重新指定容器长度
//若变长,扩容部分赋值为0;若变短,超出长度的元素被删除
.resize(num,elem);//重新指定容器长度
//若变长,扩容部分赋值为elem;若变短,超出长度的元素被删除

list的反转与排序

.reverse();//反转链表
.sort();//链表排序
//sort(lst1.begin(),lst1.end())//错误
//所有不支持随机访问迭代器的容器,不能使用标准算法
//但不支持随机访问迭代器的容器,内部会提供一些算法来弥补

list的插入/删除

.push_back(elem);//尾插
.push_front(elem);//头插
.pop_back();//尾删
.pop_front();//头删
.insert(pos,elem);//在迭代器pos处插入一个元素elem,并返回新数据的位置
.insert(pos,n,elem);//插入n个元素elem,无返回值
.insert(pos,begin,end);//在迭代器pos处插入begin,end区间(左闭右开)的数据,无返回值.clear();//清空容器
.erase(begin,end);//删除区间,返回下一个数据的位置
.erase(pos);//按位删除,返回下一个数据的位置
.remove(elem);//按值删除

2.单向链表容器std::forward_list

before_begin()	//返回一个前向迭代器,其指向容器中第一个元素之前的位置。
begin()	//返回一个前向迭代器,其指向容器中第一个元素的位置。
end()	//返回一个前向迭代器,其指向容器中最后一个元素之后的位置。cbefore_begin()//和 before_begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。cbegin()//和begin()功能相同,只不过在其基础上增加了const属性,不能用于修改元素
cend()	//和end()功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素empty()	//判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。max_size()	//返回容器所能包含元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。front()	//返回第一个元素的引用。
assign()	//用新元素替换容器中原有内容。
push_front()	//在容器头部插入一个元素。emplace_front()	//在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。pop_front()	//删除容器头部的一个元素。emplace_after()	//在指定位置之后插入一个新元素,并返回一个指向新元素的迭代器。和insert_after() 的功能相同,但效率更高。insert_after()	//在指定位置之后插入一个新元素,并返回一个指向新元素的迭代器。
erase_after()	//删除容器中某个指定位置或区域内的所有元素。
swap()	//交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
resize()	//调整容器的大小。
clear()	//删除容器存储的所有元素。splice_after()	//将某个 forward_list 容器中指定位置或区域内的元素插入到另一个容器的指定位置之后。remove(val)	//删除容器中所有等于 val 的元素。
remove_if()	//删除容器中满足条件的元素。
unique()	//删除容器中相邻的重复元素,只保留一个。merge()	//合并两个事先已排好序的 forward_list 容器,并且合并之后的 forward_list 容器依然是有序的。sort()	//通过更改容器中元素的位置,将它们进行排序。
reverse()	//反转容器中元素的顺序。

四、栈容器

1.栈容器std::tack

  • <stack> 的底层容器可以是任何支持随机访问迭代器的序列容器,如 vector 或 deque

基本语法:

#include <stack>stack<T> s;

基本操作:

push();//在栈顶添加一个元素:入栈/压栈
pop();//移除栈顶元素:出栈
top();//返回栈顶元素的引用,但不移除:取栈顶值empty();//检查栈是否为空:判空
size();//返回栈中元素数量

五、映射容器

1.映射容器std::map

map容器是一个“键值对”key-val的映射,其内部实现是一颗以key为关键码的红黑树。map的key和value可以是任意类型,其中key的数据类型必须定义小于号运算符。

基本语法:

#include <map>map<T,T> m;//map<key_type,val_type> map_name;
//例如:
map<long long,bool>vis;
map<string,int> hash;
map<pair<int,int>,vector<int>> test;

常用内置函数:

size();empty();clear();begin();end();

insert();//参数为pair<key_type,val_type>;

例:m.insert({"666",666});

find(x);在映射容器中查找key为x的二元组。

operator[];//下标访问操作符重载

//m[key]返回key映射的val的值的引用,时间复杂度为O(logn);

//[]操作符是map最吸引人的地方。

map与unordered_map的区别:前者是红黑树,后者是哈希表;前者有序,后者无序

六、集合容器

头文件<set>主要包括set和multiset两个容器,分别是有序集合和有序多重集合。前者元素不能重复,后者可以包含若干个相等的元素。两者的底层都是一颗红黑树,支持的函数基本相同。

1.集合容器std::set

2.多重集合容器std::multiset

基本语法:

#include <set>std::set<T> set_name;
std::multiset<T> multiset_name;//以上为缺省型声明,即不明确排序方式--默认为升序
//以set为例:
std::set<T,less<T>>,将T类型的数据按照升序排列
std::set<T,greater<T>>,将T类型的数据按照降序排列
//由于需要对T类型进行排序,所以如果T类型为结构体类型,必须定义小于号

内置函数:

size()、empty()、clear();

insert():s.insert(x)把一个元素插入到集合s中,时间复杂度O(logn)。在set中由于是去重的,不会重复插入元素,当元素已经存在时,insert()对集合状态无影响。

find():s.find(x)在集合s中查找等于x的元素,并指向该元素的迭代器。不存在返回s.end()。时间复杂度为O(logn)

lower_bound():s.lower_bound(x)查找大于等于x的元素中最小的一个,并返回指向该元素的迭代器。

upper_bound():查找大于x的元素中最小的一个,并返回指向该元素的迭代器。

count():s.count(x),返回集合s中等于x的元素个数,时间复杂度为O(k+logn),k为元素x的个数。

七、无序容器(C++11引入)

1.无序集合容器std::unordered_set

C++ 容器类 <unordered_set> | 菜鸟教程

 2.无序映射容器std::unordered_map

C++ 容器类 <unordered_map> | 菜鸟教程

3.无序多重集合容器std::unordered_multiset

特点:无序,不去重。其余与unordered_set类似

4.无序多重映射容器std::unordered_multimap

特点:无序,不去重。其余与unordered_map类似


C++ 标准库 | 菜鸟教程 (runoob.com)

感谢大家!

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

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

相关文章

常用的自动化测试工具有哪些?

什么是自动化测试&#xff1f;简单来说&#xff0c;自动化测试就是通过重复执行预定义的动作来执行测试用例的系统来代替人工操作。为了充分利用自动化&#xff0c;必须选择正确的自动化测试工具。 一、自动化测试工具有哪些 1、Selenium WEB自动化测试 Selenium是网页应用中最…

electron-builder打包vue2项目不显示element-ui图标

1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在vue.config.js配置 const { defineCon…

C# 冒泡排序

栏目总目录 概念 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过重复遍历待排序的数列&#xff0c;比较每对相邻的项&#xff0c;并在顺序错误时交换它们的位置&#xff0c;直到没有需要交换的项为止。由于排序过程中小数逐渐“浮”到前…

代码随想录day20 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树

代码随想录day20 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树 669. 修剪二叉搜索树 我自己的思路是和前一道题一样&#xff0c;遇见一个不符合的就调用一次删掉该结点的函数&#xff0c;这样明显就麻烦了&#xff0c;其实只要小于…

BUUCTF [MRCTF2020]Ezpop

这道题对于刚接触到pop链的我直接把我整懵了&#xff0c;一边看着魔术方法一边分析 魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程&#xff0c;简单编程 (twle.cn) 代码解析 经过以上的分析我们可以理一下解题思路&#xff1a;接收参数反序列化之前先触发…

03 capture软件操作界面和常用设置介绍04 capture软件自带元件库设置

03 capture软件操作界面和常用设置介绍&&04 capture软件自带元件库设置 第一部分 03 capture软件操作界面和常用设置介绍一、分辨率二、产品选择三、颜色设置四、格点设置 第二部分 04 capture软件自带元件库设置 第一部分 03 capture软件操作界面和常用设置介绍 一、…

C++要点总结_02_表达式与语句

表达式与语句 2 表达式与语句2.1 算术运算符 2 表达式与语句 运算符就是具有运算功能的符号。“::” &#xff1a;作用域运算符。->&#xff1a;成员指针运算符。运算符种类&#xff1a;算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、移位运算符、sizeof运算…

持续更新-各种趁手的开源工具

开源工具名称用途参考及备注 zcurd zcurd是一个通用的后台管理系统&#xff0c;有完善的用户、菜单权限管理及表单管理的开发方案。 https://www.oschina.net/p/zcurd?hmsraladdin1e1 简单业务可以通过[表单配置]快速生成&#xff0c;特定业务通过代码生成&#xff0c;完成…

Python | Leetcode Python题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; # The isBadVersion API is already defined for you. # def isBadVersion(version: int) -> bool:class Solution:def firstBadVersion(self, n: int) -> int:left, right 1, nwhile left < right:mid left (right - left) //…

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说&#xff0c;这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…

力扣高频SQL 50题(基础版)第七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题1068. 产品销售分析 I题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图:总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题 1068. 产品销售分析 I 题目说明 …

大模型额外篇章三:vercel搭建openai中转服务器

文章目录 一、起因和注意1)起因2)注意二、实现方法(原理:透传)1)nginx方案2)node服务3)纯 js 方案4)选择国外的域名服务商(DNS 解析路径缩短,建议方案国外提供 CDN 云服务商结合自建云服务业务做负载均衡)三、实践(vercel部署OpenAI代理服务器)四、测试搭建的Ope…

微前端--qiankun

qiankun qiankun分为accpication和parcel模式。 aplication模式基于路由工作&#xff0c;将应用分为两类&#xff0c;基座应用和子应用&#xff0c;基座应用维护路由注册表&#xff0c;根据路由的变化来切换子应用。子应用是一个独立的应用&#xff0c;需要提供生命周期方法供…

我的创作纪念日(第4096天)

机缘 上大学时开始接触CSDN&#xff0c;2005年开了一个帐号&#xff0c;但后来弄丢了&#xff0c;2012年开了这个号&#xff0c;开始在上面分享一些心得&#xff0c;“好记性不如烂笔头”&#xff0c;写作可以让一些自己认为有价值的东西留下来。也有人说&#xff0c;学习不仅…

【中项】系统集成项目管理工程师-第5章 软件工程-5.4软件实现

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

51单片机嵌入式开发:14、STC89C52RC 之HX1838红外解码NEC+数码管+串口打印+LED显示

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STC89C52RC 之HX1838红外解码NEC数码管串口打印LED显示 STC89C52RC 之HX1838红外解码NEC数码管串口打印LED显示1 概述2 硬件电路2.1 遥控器2.2 红外接收器电路2.3 STC89C52单…

【JAVA开发笔记】Reids下载、安装、配置-Windows篇(超详细,含Redis可视化管理工具!!!)

目录 1. Redis 简介 2. 下载 Redis 安装包 3. 开启 Redis 服务 4. 配置环境变量 5. Redis 服务注册为系统服务 6. Redis 服务测试和简单使用 7. 下载安装 Redis 管理工具 8. 管理工具连接 Redis 服务器 1. Redis 简介 Redis&#xff08;Remote Dictionary Server&…

Pytorch transforms 的研究

绝对路径与相对路径差别 transforms的使用 from torchvision import transforms from PIL import Imageimg_path "dataset/train/bees/16838648_415acd9e3f.jpg" img Image.open(img_path) tensor_trans transforms.ToTensor() tensor_img tensor_trans(img) prin…

etcd节点通信的协议和端口

etcd是一个分布式键值存储系统&#xff0c;它提供了一种高可用的方式来存储配置和服务信息。在etcd中&#xff0c;节点之间的通信主要依赖于HTTP协议&#xff0c;并且使用gRPC作为客户端与etcd服务端之间的通信接口 。以下是etcd节点通信的协议和端口的详细信息&#xff1a; 客…

PostgreSQL 中如何实现数据的批量插入和更新?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何实现数据的批量插入和更新&#xff1f;一、批量插入数据1. 使用 INSERT INTO 语句结…