Longstick的学习周记——第十四周

前言

呃,其实是两周没有更新了,上周是在打数模,停更了一下。。这周开始恢复正常吧。

哇想想要开始找工作了,突然压力好大哦,有同学已经都拿到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种。

  1. 前向迭代器
    假设p是一个前向迭代器,则p支持++p,p++,*p操作,还可以被复制或赋值,可以用==或 !=运算符进行比较。两个正向迭代器也可以互相赋值。
  2. 双向迭代器
    双向迭代器就是在前向迭代器的基础上,增添p--,--p操作。
  3. 随机访问迭代器
    在双向迭代器的基础上,假设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 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。

具体可参考:STL教程:C++ STL快速入门(非常详细)C++ STL也就是C++标准模板库,它是C++标准库的一部分。STL的目的是标准化组件,它实现了常用的数据结构和算法,这套快速入门教程将为你详细地讲解。http://c.biancheng.net/stl/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值