2020-11-23

STL入门介绍

一、STL是什么
STL全称为Standard Template Library,即标准模板库,该库提供一些常用的容器对象和一些通用的算法等,可以理解STL就是一个库,该库帮我们封装了很多容器类和通用的方法,我们可以通过调用该库中封装好的方法和容器类来进行编程,相比C#而言,STL就好比.NET类库中的某个DLL。例如,C#中,List类存在于mscorlib.dll中System.Collections.Generic命名空间下,C++中,list存在于list头文件中std命名空间下,所以C++代码中要使用list容器(在C++中把list称为容器,即一系列元素的集合),必须先通过#include引入list头文件,类似于C#中的添加mscorlib.dll引言,再使用use namespace std 引入命名空间,类似于C#中using System.Collections.Generic代码。
二、STL六大组件
STL通过模板抽象了基于数据结构之上的普遍行为,形成了独特的STL算法。在STL中,这些数据结构称为容器。在容器和算法之间通过中间体:迭代器来进行连接,迭代器可以看作是数据结构和算法之间的纽带,它降低了数据结构和算法之间的耦合度。STL中又包括六大核心组件,它们分别是:
#容器(Container)
#算法(Algorithm)
#迭代器(Iterator)
#函数对象,又称仿函数(Function object)
#适配器(Adaptor)
#空间配置器(Allocator)
2.1容器
STL中容器可分为序列式和关联式容器,其中,序列式容器的每个元素的位置取决于元素被插入是设置的位置,和元素值本身无关。而关联式容器的元素位置取决于特定的排序规则,和插入顺序无关。意思就是说,序列式容器中每个元素的位置与插入的顺序对应,而关联式容器中元素会根据特定的排序规则对每个元素进行排序,与元素插入的顺序无关。
序列式容器包括:vector、list和deque
关联式容器包括:set、multiset、map和multimap
vector:在序列尾部进行插入和删除,访问和修改元素的时间复杂度为O(1),但插入和删除的时间复杂度与到末尾的距离成正比。内存结构:单端数组。可随机存取。元素搜寻速度慢。头文件
list:对任意元素的访问与两端的距离成正比,但对某个位置的插入与删除花费为常数时间,即O(1)。内存结构:双向链表。不可随机存取。元素搜寻速度非常慢。头文件
deque:与vector基本相同,唯一不同的是,在序列头部插入和删除的时间复杂度也是O(1)。内存结构:双端数组。可以随机存取。元素搜寻速度慢。头文件
set:由节点组成的红黑树,具有快速查找的功能。内存结构:二叉树。不可随机存取。元素搜寻速度快。头文件
multiset:可以支持重复元素,同样具有快速查找能力。内存结构:二叉树。不可随机存取。元素搜寻速度快。头文件
map:由{键,值}对组成的集合,同样具有快速查找能力。内存结构:二叉树。对key而言可以随机存取。对key而言元素搜寻速度快。头文件
multimap:一个键可以对应多个值,同样具有快速查找能力。内存结构:二叉树。不可随机存取。对key而言元素搜寻速度快。头文件

上面列出的所有容器在C#中都有相应的对应形式,它们之间的对应关系为:
std:vector-------List类
std:list---------LinkedList类
std:map-------SortedDictionary<TKey,TValue>类
std:set-------HashSet类,但这里需要明确,STL中的set是一红黑树作为底层数据结构,而C#中HashSet类是以哈希表作为底层数据结构,因为其两者使用数据结构的不同,从而导致查询效率不同,set查找的花费时间为O(logn),这也是红黑树查询时间,而HashSet的查询花费时间为O(1)。
std:multimap------Dictionary<TKey,int>(第二个参数存储着Key的数量)

2.2算法
算法是用来操作容器中数据的模板函数,它抽象了对数据结构的操作行为。要使用STL中定义的算法,应首先引入头文件。例如STL中的sort()函数可以对容器中的数据进行排序,可以使用find()函数来搜索容器中的某个元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值