2368 字
12 分钟
STL概念及其部分容器知识
2023-08-22

STL基本概念#

STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统 称。现在主要出现在 c++ 中,但是在引入 c++ 之前该技术已经存在很长时间了。   STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。STL(Standard Template Library)标准模板库,在我们 c++ 标准程序库中隶属于 STL 的占到了 80%以上。

1. STL是什么#

了解 中文与英文的全称 广义上分为哪三个 这三个之间的关系 主要采用了什么,相比传统的由()库有什么优势 1 1 1 1 1 标准模板库(Standard Template Library) 广义上分为:容器(container)、算法(algorithm)、迭代器(iterator) 容器和算法之间通过迭代器进行无缝衔接 STL 几乎所有的代码都采用了==模板类或者模板函数==,这相比传统的由函数和类组成的库来说 提供了更好的==代码复用机会==

2. STL有哪六大组件#

了解 1 1 1 1 1 容器、算法、迭代器、仿函数、适配器、空间配置器

3. STL的容器是什么#

是各种(),如(),用来() 从现实角度看,STL容器是一种() 1 1 1 1 1 是各种数据结构,如vector,list,deque,set,map等,用来存放数据 从现实角度看,STL容器是一种class template

4. STL的算法是什么#

就是各种(),如() 从现实角度看,STL算法是一种() 1 1 1 1 1 就像它的名字一样,就是各种常用的算法,如sort,find,copy,for_each 从现实角度看,STL算法是一种function template

5. STL的迭代器是什么#

扮演了()之间的胶合剂 从现实来看,迭代器是一种将()等指针相关操作重载的() 所有的STL()都有自己专属的迭代器 1 1 1 1 1 扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> ,operator++,operator—等指针相关操作予以重载的class template 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素

原生指针(native pointer)也是一种迭代器。

容器特点#

可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map;

特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的!

序列式容器才可以在容器初始化的时候指定大小,关联式容器不行;

注意,关联容器的迭代器不支持it+n操作,仅支持it++操作

序列式容器#

vector相关知识点#

6. 使用场景#

1 1 1 1 1 数组

7. 特点#

本质是()的(),空间不足时如何分配空间 删除元素时,(),所以() 对删除或插入操作的执行效率(),越靠后插入或删除执行效率() ()的容器 底层内存空间() 扩容机制 1 1 1 1 1 (1) 本质是一个动态分配的数组(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间);

(2) 当删除元素时,不会释放限制的空间,所以vector容器的容量(capacity)大于vector容器的大小(size);

(3) 对于删除或插入操作,执行效率不高,越靠后插入或删除执行效率越高;

(4) 高效的随机访问的容器。

(5) 底层内存空间连续

(6) 扩容机制:当旧的存储空间不够时,扩充一个新的空间,空间大小为原来大小的两倍,复制元素到新的空间,并释放旧空间。

8. 底层数据结构#

是(),所以支持(),插入尾部空间复杂度() 1 1 1 1 1 是数组,所以支持O(1)快速随机访问,插入尾部为O(n)

9. 创建vector对象#

2种 1 1 1 1 1 vector v1;// 空数组 vector v1(10);// 数组中有10个0

10. 基本操作#

大小 尾插 尾删 获取头部元素 获取尾部元素 头部元素迭代器 尾部元素迭代器 插入 1 1 1 1 1 大小v.size(); 尾插v.push_back(); 尾删v.pop_back(); 获取头部元素v.front(); 获取尾部元素v.back(); 头部元素迭代器v.begin(); 尾部元素迭代器v.end(); 插入v.insert(pos, elem);// pos位置,elem元素

deque相关知识点#

11. deque特点#

中英文全称 有()和(),分别是有什么功能 向()插入元素效率较高,为什么 向()插入元素效率较低 1 1 1 1 1 (1) deque(double-ended queue 双端队列);

(2) 具有分段数组、索引数组, 分段数组是存储数据的,索引数组是存储每段数组的首地址;

(3) 向两端插入元素效率较高!

若向两端插入元素,如果两端的分段数组未满,既可插入;如果两端的分段数组已满,

则创建新的分段函数,并把分段数组的首地址存储到deque容器中即可)。

中间插入元素效率较低

12. deque的底层数据结构#

底层内存空间(),通常是() 通过()数组中的()来管理不同的() 1 1 1 1 1 底层内存空间不一定连续,通常是一段一段的连续空间,通过map(非STL中的map)数组中的指针来管理不同的连续空间。

13. deque如何实现“整体连续”#

通过建立(),deque 容器申请的这些分段的连续空间就能实现“整体连续”的效果

当 deque 容器需要在头部或尾部增加存储空间时,它会(),同时在()的开头或结尾添加(),由此该空间就串接到了 deque 容器的头部或尾部 1 1 1 1 1 通过建立 map 数组,deque 容器申请的这些分段的连续空间就能实现“整体连续”的效果

当 deque 容器需要在头部或尾部增加存储空间时,它会申请一段新的连续空间,同时在 map 数组的开头或结尾添加指向该空间的指针,由此该空间就串接到了 deque 容器的头部或尾部。

14. 创建deque对象#

两种 1 1 1 1 1 deque d1; deque d2(10);

list相关知识点#

15. list特点#

是(),()效率高,()效率低 1 1 1 1 1 是双向链表,可以高效地进行首尾插入删除元素。 中间==删除==元素效率低

16. list的底层数据结构#

是(),每个节点都有() 1 1 1 1 1 是一个双向链表(每个节点有指向前驱和指向后继的两个指针)

关联式容器#

map容器相关知识点#

17. map的使用场景#

3种 1 1 1 1 1 去重类问题 可以打乱重新排列的问题 有清晰的一对一关系的问题

18. map的特点#

()是单重映射,()是多重映射 map与multimap的区别 map和multimap内部自建了(),可以对数据(),()效率高,所以map、multimap里的数据都是(),这也是我们通过map简化代码的原因。 自动建立()的对应关系 key和value一一对应的关系可以() 1 1 1 1 1 (1) map为单重映射、multimap为多重映射;

(2) 主要区别是map存储的是无重复键值的元素对,而multimap允许相同的键值重复出现,既一个键值可以对应多个值。

(3) map和multimap内部自建了一颗红黑二叉树,可以对数据进行自动排序,插入、删除效率高,所以map、multimap里的数据都是有序的,这也是我们通过map简化代码的原因。

(4)自动建立key-value的对应关系,key和value可以是你需要的任何类型。

(5) key和value一一对应的关系可以去重

19. map的底层数据结构#

由()实现,()高,因为() 1 1 1 1 1 都由红黑树实现,但空间占用率高,因为每个节点要保存父、子节点和红黑性质。

20. map创建对象#

()类似 两种 1 1 1 1 1 map与multimap类似

map<T1,T2> m;

map<T1,T2, op> m; //op为排序规则,默认规则是less**(升序排列)**只会按键==去排序!,可以用结构体重载()对 键自定义排序

代码示例

#include <map>
#include <string>
#include <iostream>
using namespace std;
int main(){
//关键是这句话 按字符串长度排序 也只能对键进行排序
map<string, int, greater<string> > mapStudent;
mapStudent["LiMin"]=90;
mapStudent["ZiLinMi"]=72;
mapStudent["BoB"]=79;
map<string, int>::iterator iter=mapStudent.begin();
for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
return 0;
}

21. map插入数据#

插入数据 使用pair<>构造键值对对象

map<int, float> m;
m.insert(pair<int, float>(10,2.3));

使用make_pair()函数构建键值对对象

map<int,float> m;
m.insert(make_pair(10,2.3));

使用value_type标志

map<int, float> m;
m.insert(map<int,float>::value_type(10,2.3));
m[key] = value; //m只能是map容器,不适用于multimap

unordered_map/unordered_multimap#

22. 特点#

与map、multimap区别() 1 1 1 1 1 与map、multimap的区别之处:无序性,查找相对快,插入删除相对慢

23. 底层数据结构#

都是(),故查找效率(),适用于() 1 1 1 1 1 都是哈希表,故查找效率相对高为O(n),适用于查找多的场合。

STL概念及其部分容器知识
https://fuwari.cbba.top/posts/stl概念及其部分容器知识/
作者
Chen_Feng
发布于
2023-08-22
许可协议
CC BY-NC-SA 4.0