STL总结

摘自《算法笔记》

1 vector

长度根据需要自动改变的数组

case:
1. 用普通数组会超内存时
2. 以邻接表的方式储存图

使用方法

添加vector头文件

#include<vector>
using namespace std;

定义

vector<typename> name;

typename可以是

  1. 基本类型

    int,double,char,结构体

    vector<int> name;
    vector<node> node;//node为结构体
    
  2. STL标准容器

    vector,set,queue

    在两个>之间加上空格,形如> >

    vector<vector<int> > name;//>>之间要加空格
    
vector<typename> Arrayname[arraySize];

下标0~arraySize-1 每一个都是一个vector容器

访问

  1. 下标访问

    直接vi[index]

  2. 迭代器访问

    vector<typename>::iterator it;
    

    it是一个vector<typename>::iterator型变量,可通过*it访问vector里的元素

相关函数

vi.function()

begin():取vi的首元素地址

end():取尾元素地址的下一个地址

迭代器不支持it < vi.end()写法,因此循环条件只能用it != vi.end()

push_back(x):在vector后面添加一个元素x

pop_back():删除vector的尾元素

size():获得vector中元素个数,返回的是unsigned类型

clear():清空vector中的所有元素

insert(it,x):向vector的任意迭代器it处插入一个元素x

erase():删除单个元素vi.erase(it)、删除一个**区间[first,last)**内的所有元素vi.erase(first,last)

常见用途

  • 储存数据
  • 使用邻接表存储图

2 set

内部自动有序且不含重复元素的容器

case
1.需要去掉重复元素时
2.元素比较大或类型不是int型而不能直接开散列表时,使用set保留元素本身而不考虑个数

使用方法

添加set头文件

#include<set>
using namespace std;

定义

set<typename> name;

typename可以是任意类型【写法同vector基本一样】

访问

只能通过迭代器

set<tyoename>::iterator it;

**除开vector和string之外的STL容器都不支持*(it+i)**的访问方式

只能使用

for(set<int>::iterator it = st.begin();it != st.end(); it++)

来枚举。

set内元素自动递增排序,且自动去除了重复元素

相关函数

insert(x):将x插入set容器中,自动递增排序和去重,时间复杂度 o ( log ⁡ N ) o(\log N) o(logN)

find(value):返回set中对应值为value的迭代器,时间复杂度 o ( log ⁡ N ) o(\log N) o(logN)

erase():两种用法:删除单个元素、删除一个区间内的所有元素

  • 删除单个元素

    • st.erase(it), o ( 1 ) o(1) o(1)
    • st.erase(value), o ( log ⁡ N ) o(\log N) o(logN)
  • 删除一个区间内所有元素

    st.erase(first,last)

size():获得set内元素的个数

clear():清空set中的所有元素

常见用途

自动去重并按升序排序

3 string

使用方法

添加string头文件

#include<string>
using namespace std;

定义

string str;

访问

  1. 下标访问 str[i]

    读入和输出整个字符串,只能用cincout

  2. 通过迭代器访问

    string::iterator it;
    

    string和vector一样,支持直接对迭代器进行加减某个数字

相关函数

operator +=:将两个string直接拼接起来

两个string类型可以直接使用==, !=, <, <=, >, >=比较大小,比较规则是字典序

length()/size():返回string的长度

insert()

  • insert(pos,string):在pos号位置插入字符串string
  • insert(it,it2,it3):it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,[it2,it3)将被插在it位置上

erase():删除单个元素,删除一个区间内所有元素

  • 删除单个:str.erase(it)
  • 删除所有:
    • str.erase(first,last)
    • str.erase(pos,length)

clear():清空所有

substr(pos,len):返回从pos位开始,长度为len的子串

string::npos:一个常数,本身值为-1,也可认为是unsigned_int类型的最大值,用以作为find函数失配时的返回值

find()

  • str.find(str2):当str2时str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,返回string::npos
  • str.find(str2,pos):从str的pos位开始匹配str2,返回值与上相同

replace()

  • str.replace(pos,len,str2):把str从pos号位开始、长度为len的子串替换为str2
  • str.replace(it1,it2,str2):把str的迭代器[it1,it2)范围的子串替换为str2

4 map

数组将int型映射到其他类型

map可以将任何基本类型(包括stl容器)映射到任何基本类型(包括stl容器)

使用方法

map<typename1,typename2>mp;

typename1:键的类型

typename2:值的类型

访问

  1. 通过下标访问,map中的键是唯一的

  2. 通过迭代器访问

    map<typename1,typename2>::iterator it;
    

    it->first访问键,it->second访问值

    map会以键从小到大的顺序自动排序

相关函数

find(key):返回键为key的迭代器

erase()

  • 删除单个元素

    • mp.erase(it)
    • mp.erase(key)
  • 删除一个区间内的所有元素

    erase(firsr,last)

size():获得map中映射的对数

clear():清空map中的所有元素

常见用途

  • 简历字符或字符串之间映射的题目
  • 判断大整数或者其他类型数据是否存在的题,可以把map当bool数组用
  • 字符串和字符串的映射也可能会遇到

5 queue

使用方法

添加头文件queue

#include<queue>
using namespace std;

定义

queue<typename> name;

访问

front()访问队首元素

back()访问队尾元素

相关函数

push():入队

pop():出队

empty():检查queue是否为空,true则空

size():返回queue内元素个数

常见用途

  • 广度优先搜索

6 priority_queue

优先队列,底层用堆来实现,队首元素一定是当前队列中优先级最高的那一个

可以在任意时候往优先队列里面加入push元素,优先队列底层的数据结构堆heap会随时调整结构,使得每次的队首元素都是优先级最大的

使用方法

添加头文件queue

#include<queue>
using namespace std;

定义

priority_queue<typename> name;

访问

只能通过top()函数来访问队首元素

相关函数

push()

top():获得队首元素

pop():队首元素出队

empty()

size()

优先级设置

  • 基本数据类型:一般是数字大的优先级越高

    priority_queue<int> q;
    priority_queue<int,vector<int>,less<int>> q;
    

    vector是承载底层数据结构堆的容器

    less是对第一个参数的比较类,表示数字大的优先级越大,greater表示数字小的优先级越大

  • 结构体

    重载比较符号

常见用途

  • 贪心问题
  • Dijkstra算法优化

使用top函数前,必须用empty判断优先队列是否为空

7 stack

使用方法

添加头文件stack

#include<stack>
using namespace std;

定义

stack<typename> name;

访问

top()

常用函数

push()

top()

pop()

empty()

size()

常见用途

实现递归

8 pair

将两个元素绑在一起作为一个合成元素、又不需要定义结构体,可以看成一个内部有两个元素的结构体

使用方法

#include<utility>
or
#include<map>
using namespace std;

定义

pair<typeName1,typeName2> name;

//定义时初始化
pair<string,int>p("haha",5);
//临时构建一个pair
pair<string,int>("haha",5)
make_pair("haha",5)

访问

按正常结构体的方法去访问

相关函数

可以直接使用==, !=, <, <=, >, >=比较大小,比较规则时先以first大小作为标准,当first相等时判别second的大小

常见用途

  • 代替二元结构体及其构造函数,可以节省编码时间
  • 作为map的键值对来进行插入

9 algorithm头文件下的常用函数

#include<algorithm>
using namespace std;

max(),min(),abs()

2个数最值:max(x,y)

3个数最值:min(a,min(b,c))

整数绝对值:abs(x)

浮点型:fabs(x),math头文件

swap()

交换两个值

reverse()

reverse(it,it2)将数组指针在[it,it2)之间的元素进行反转

next_permutation()

一个序列在全排列中的下一个序列

fill()

把数组或容器中某一段区间赋为某个相同的值,数组类型对应范围中的任意值

fill(it,it2)

sort()

sort(首元素地址必填,尾元素地址的下一个地址必填,比较函数非必填)

不填比较函数,默认对前面给出的区间进行递增排序

cmp()

bool cmp(typename1,typename2){}
...
sort(type1,type2,cmp);

lower_bound(),upper_bound()

需要用在一个有序数组或容器中

lower_bound(first,last,val):[first,last)中第一个值大于等于val的元素的位置(指针或迭代器)

upper_bound(first,last,val):[first,last)中第一个值大于val的元素的位置(指针或迭代器)

如果没有需要寻找到元素,则返回的是可以插入该元素的位置或迭代器

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值