1.list(链表)
list是一个线性双向链表结构,不使用连续的内存空间,可以快速的插入删除,不支持随机的内部访问。使用需要包include<list>
头文件
push_front(val)
//将val插入链表最前面push_back(val)
//将val插入链表最后面pop_front()
//删除链表最前面的元素sort()
//将链表从小到大排序remove(val)
//删除和val相等的元素merge(list<T> &x)
//将链表x合并进行并清空x,要求链表自身和x有序splice(iterator i, list <T> & x, iterator first, iterator last)
//在位置 i 前面插入链表 x 中的区间 [first, last),并在链表 x 中删除该区间
2.stack(栈)
stack,后进先出,不能遍历。需要包含include<stack>
头文件
stack<int> s
//创建实例s.push(val)
//val入栈a=s.top()
//返回栈顶元素s.pop()
//出栈bool flag=s.empty()
//判断是否为空len=s.size()
//栈的长度
3.queue(队列)
queue,先进先出,不能遍历。需要包含include
queue<int> q
//创建实例q.push(val)
//val入队a=q.front()
//返回队头b=q.back()
//返回队尾q.pop()
//出队bool flag=q.empty()
//队列是否为空len=q.size()
//队列长度
4.priority_queue(优先队列)
可以认为是是队列的一种,但是会按照一种优先规律,将优先级高的元素始终置于队头。底层通过堆实现,默认大根堆
- 基本操作和队列类似
priority_queue<int> q
//创建实例,默认大顶堆priority_queue <int,vector<int>,greater<int> > q
//小顶堆- 也可以cmp实现
-
1
2
3
4
5struct cmp{
bool operator()(int a, int b){
return a > b;
}
};
5.set(集合)
set内部通过红黑树实现,实现了一个自动排序,元素值唯一的容器。查找的复杂度为(logn),set中的元素不能直接被修改,在其中查找属于二分查找。使用需要包含include<set>
头文件
set<int> s
//创建实例set<int>::iterator it
// 迭代器s.insert(val)
//插入vals.erase(iterator it)
//删除s.lower_bound(val)
//返回第一个大于等于val的值s.upper_bound(val)
//返回第一个大于val的值
6.vector(向量)
可以近似地认为是一个动态的数组,使用需要包含include<vector>
头文件
vector<int> v
//创建实例vector<int> v(10,1)
//创建有10个元素的向量,初始值是1int b[7]={1,2,3,4,5,9,8};vector<int> a(b,b+7);
vector<int>::iterator it
//创建迭代器-
1
2for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;//迭代器访问 v.push_back(val)
//尾部插入valv.pop_back()
//尾部删除v.insert(v.begin()+i,a)
//在第i+1个元素前面插入av.erase(v.begin()+2)
//删除第3个元素v.size()
//向量大小
7.map&&pair(关联)
map内部也是通过红黑树实现的,map的形式为一个键值对,和set一样查找的复杂度为logn,可以修改value,不能修改key.使用需要包含include<map>
map <int,string> m
//创建了一个以int为key,string为value的键值对。map <int,string>::iterator it
m.insert(make_pair(1,"one"))
/m[1]="one"
m.size()
//map的大小m.erase()
//删除元素m.count(val)
//返回val出现的次数0/1
8.常用算法
sort(start,end,排序方法)
reserve(vec.begin(),vec.end())
//反转容器make_heap(begin(),end())
//对一个序列建立一个堆,默认大根堆,greater()则是小根堆