前言
呃,其实是两周没有更新了,上周是在打数模,停更了一下。。这周开始恢复正常吧。
哇想想要开始找工作了,突然压力好大哦,有同学已经都拿到offer了,我还在这连简历还没投,也不敢投啊,力扣都没刷,这不是白给吗。
加油吧,投个简历,刷刷题,期望能有好结果。还有希望科三马上过了。
STL学习笔记
在以前学C++和数据结构的时候,因为要把原理写清楚,一般老师都要求自己手敲结构,不让使用STL这种库,所以也没有接触过,发现现在刷力扣的时候基本都需要使用到。看来自己不得不要学习一下这个库。
基本了解了一下,其实就是吧之前学过的数据结构封装好,做成一个很方便又很灵活使用的模版,简单实现很多功能。
关于STL容器
容器可以理解为模版类的集合,就是封装好的数据结构,STL提供了3种标准容器,分别是序列容器、排序容器和哈希容器,后两者有时也称为关联容器。
容器种类 | 内容 |
---|---|
序列容器 | 主要包括Vector向量容器、list列表容器以及deque双端队列容器。 元素在容器中的位置与元素的值无关、即容器是不排序的。 |
排序容器 | 包括set集合容器、multiset多重集合容器、map映射容器以及multimap多重映射容器。 排序容器中的元素默认是从小到大排序好的,查找时有非常好的性能。 |
哈希容器 | unordered_set哈希集合、unordered_multiset哈希多重集合、unordered_map哈希映射以及unordered_multimp哈希多重映射。 容器不同,元素在容器中是不排序的,位置由哈希函数确定。 |
关于STL迭代器
遍历是使用容器的过程中最常用的操作,在STL的容器中,大多数情况会使用迭代器(iterator)来实现。简单来说,迭代器与C++中的指针非常类似,指向容器中某个元素,如果需要还可以进行读写操作。
常用的迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器5种。
- 前向迭代器
假设p是一个前向迭代器,则p支持++p,p++,*p操作,还可以被复制或赋值,可以用==或 !=运算符进行比较。两个正向迭代器也可以互相赋值。 - 双向迭代器
双向迭代器就是在前向迭代器的基础上,增添p--,--p操作。 - 随机访问迭代器
在双向迭代器的基础上,假设p是随机访问迭代器,i是一个整型变量或者常量,则p支持:
p+=i:p往后移动i个元素。
p-=i:p往前移动i个元素。
p+i:返回p后面第i个元素的迭代器。
p-i:返回p前面第i个元素的迭代器。
p[i]:返回p后面第i个元素的引用。
此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。另外,表达式 p2-p1 也是有定义的,其返回值表示 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。
容器 | 对应迭代器类型 |
---|---|
array | 随机访问迭代器 |
vector | 随机访问迭代器 |
deque | 随机访问迭代器 |
list | 双向迭代器 |
set / multiset | 双向迭代器 |
map / multimap | 双向迭代器 |
forward_list | 前向迭代器 |
unordered_map / unordered_multimap | 前向迭代器 |
unordered_set / unordered_multiset | 前向迭代器 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
STL序列容器
- array<T,N>(数组容器):表示可以存储 N 个 T 类型的元素,是 C++ 本身提供的一种容器。此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值;
- vector<T>(向量容器):用来存放 T 类型的元素,是一个长度可变的序列容器,即在存储空间不足时,会自动申请更多的内存。使用此容器,在尾部增加
- 或删除元素的效率最高(时间复杂度为 O(1) 常数阶),在其它位置插入或删除元素效率较差(时间复杂度为 O(n) 线性阶,其中 n 为容器中元素的个数);
- deque<T>(双端队列容器):和 vector 非常相似,区别在于使用该容器不仅尾部插入和删除元素高效,在头部插入或删除元素也同样高效,时间复杂度都是 O(1) 常数阶,但是在容器中某一位置处插入或删除元素,时间复杂度为 O(n) 线性阶;
- list<T>(链表容器):是一个长度可变的、由 T 类型元素组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方都可以高效地增加或删除元素(时间复杂度都为常数阶 O(1)),但访问容器中任意元素的速度要比前三种容器慢,这是因为 list<T> 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。
- forward_list<T>(正向链表容器):和 list 容器非常类似,只不过它以单链表的形式组织元素,它内部的元素只能从第一个元素开始访问,是一类比链表容器快、更节省内存的容器。
STL关联式容器
使用关联式容器存储的元素,都是一个一个的“键值对”( <key,value> ),这是和序列式容器最大的不同。除此之外,序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排序。
关联式容器名称 | 特点 |
---|---|
map | 定义在 <map> 头文件中,使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less<T>)。 |
set | 定义在 <set> 头文件中,使用该容器存储的数据,各个元素键和值完全相同,且各个元素的值不能重复(保证了各元素键的唯一性)。该容器会自动根据各个元素的键(其实也就是元素值)的大小进行升序排序(调用 std::less<T>)。 |
multimap | 定义在 <map> 头文件中,和 map 容器唯一的不同在于,multimap 容器中存储元素的键可以重复。 |
multiset | 定义在 <set> 头文件中,和 set 容器唯一的不同在于,multiset 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。 |