一、栈(stack)
栈(stack)是一种先进后出的数据结构,只能从栈顶操作,插入或删除元素。
c++中的栈stl在stack头文件中。
#include<stack>
声明方法如下:
stack<int>st;
常用函数包括:
st.push(x)//插入元素x
st.pop()//从栈顶弹出元素
st.size()//返回栈元素个数
st.empty()//返回栈是否为空,空返回1
st.top()//返回栈顶元素
时间复杂度为O(1)
二、队列(queue)
队列是一种先进先出的数据结构,从队尾插入元素,从队头取出元素
c++中的队列stl在queue头文件中。
#include<queue>
声明方法如下:
queue<int>q;
常用函数包括:
q.push(x)//从队尾插入元素
q.pop()//从队头弹出元素
q.front()//返回队头元素
q.size()//返回队列元素个数
q.empty()//返回队列是否为空
除push和pop为O(log n)外,其余时间复杂度为O(1)
三、映射(map)
map是一种有序的数据结构。它是一个键值对。
map的头文件是<map>
#include<map>
声明方法如下:
map<char,int>mp;
一个map类型的数据有两个部分,分别为键和值。可以用类似于数组访问的方法存储键值对。比如上面char类型到int类型的mp,可以通过mp['c']=1;的方法把‘c'和1这个键值对存储进mp里。
迭代器
map是通过迭代器顺序访问的。创建迭代器方法如下:
map<char,int>::iterator it;
以下是通过迭代器和for循环顺序访问mp的代码:
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
此时可以通过it->first访问键,it->second访问值。
map中的顺序是有序的,根据键从小到大排列,没有两个键相同的键值对。
map中的常用函数如下:
mp.begin()//返回指向mp头部的迭代器
mp.end()//返回指向mp尾部的迭代器
mp.find(x)//查询元素x出现的位置
mp.count(x)//查询元素x出现的次数
mp.clear()//清空mp
unordered_map
这种map是无序的map,使用方法类似于map。存在于头文件<unordered_map>中。
unordered_map底层逻辑为哈希表,所以较为省时,所有命令时间复杂度趋近于O(1)。
multimap
这种map是一键对多值的map,存在于头文件<map>中。
这两种map都通过迭代器访问
四、集合(set)
集合是一种有序去重的数据结构。存在于头文件<set>中。
声明方法如下:
set<int>s;
在这个数据结构中,不会出现两个相同的元素。元素都会自动排好序。例如输入
1,3,5,2,4,4,2,3
这几个元素,进入某个set后,通过迭代器遍历,输出为
1,2,3,4,5
set常用函数有:
s.insert(x)//插入元素x
s.eraase(x)//删除元素x
s.clear()//清除s
set迭代器创建方法与map类似
unordered_set
这种set无序且去重。即,不会排序,但不会出现两个相同元素。例如输入
1,3,5,2,4,4,2,3
时,将其存入set中,再遍历输出会得到
1,3,5,2,4
multiset
这种set有序但不去重。即,会自动排序,但也会出现两个相同的元素。例如输入
1,3,5,2,4,4,2,3
时,将其存入set中,再遍历输出会得到
1,2,2,3,3,4,4,5
unordered_set与multiset和set的关系,与unordered_map与multimap和map的关系类似