stl均要包含:using namespace std;
1.队列:
包含头文件#include<queue>
假如定义了一个结构体(可以换成数据类型)node(或者int之类的数据类型)
声明队列queue<node>q;
基本操作:
弹出队首q.pop();注意在非空情况下使用
获得队首的引用q.front(); 如node t;t=q.front(),注意在非空情况下使用
获得队尾的引用q.back(); 如node t;t=q.back(),注意在非空情况下使用
判断非空q.empty();空返回1
压入队列q.push(t);
获得大小q.size();
如果要遍历的话用迭代器什么的还是手写吧,stl的太麻烦了点
2.优先队列
包含包含头文件#include<queue>
声明priority_queue<node>q;注意这样声明是默认less<node>,如果是结构体要重载小于号,如果参数填的greater<node>,写成这样priority_queue<node,vector<node>,greater<node>>q,这样是要重载大于号,当然也可以换成cmp自己定义的一个比较函数
如:
struct node{
int priority;
friend bool operator <(const node& x,const node& y)
{
return x.priority<y.priority;//这样就是大的先弹出
}
};
priority_queue<node>q;
基本操作:
弹出队首q.pop();注意在非空情况下使用
获得队首的引用q.top(); 如node t;t=q.top(),注意在非空情况下使用
判断非空q.empty();空返回1
压入队列q.push(t);
获得大小q.size();
3.栈
包含包含头文件#include<stack>
声明:stack<node>q;
基本操作:
弹出栈首q.pop();注意在非空情况下使用
获得栈首的引用q.top(); 如node t;t=q.top(),注意在非空情况下使用
判断非空q.empty();空返回1;
压入栈q.push(t);
获得大小q.size();
4.双向队列
包含包含头文件#include<deque>
声明:deque<node>q;
基本操作:
弹出队首q.pop_front();注意在非空情况下使用
弹出队尾q.pop_back();注意在非空情况下使用
获得队首的引用q.front(); 如node t;t=q.front(),注意在非空情况下使用
获得队尾的引用q.back(); 如node t;t=q.back(),注意在非空情况下使用
判断非空q.empty();空返回1;
压入队尾q.push_back(t);
压入队首q.push_front(t);
获得大小q.size();
清除所有元素q.clear();
5.键值对map
数据大的时候有奇效
头文件
#include <map>
定义 map<int,int>M;
两个为任意类型,相当于映射
插入数据
M[1008611] =1;
查找数据和修改数据
(1) int i = my_Map["a"];
M[2222] = i;
(2) M::iterator it;
M.find("b");
(3)M.count(key):由于map不包含重复的key,因此M.count(key)取值为0,或者1,表示是否包含。
删除数据
(1) M.erase(it);
迭代数据
for (it=M.begin();it!=M.end(); +it) {}
其它方法
M.size() 返回元素数目
M.empty() 判断是否为空
M.clear() 清空所有元素
可以直接进行赋值和比较:=, >, >=, <, <=, != ,==等等
6.vector动态数组||向量
头文件#include<vector>
创建对象:vector<int>v;(int可以修改成任意类型或者结构体)
尾部插入数字v.push_back(a);注意a为同类型
迭代器声明:vector<int>::iterator it;
中间插入数据:v.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
删除数据:v.erase(it);删除迭代器it
遍历迭代器:
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
cout<<*it<<endl;
it相当于指针
清空:v.clear();
向量大小:v.size();
1) 使用reverse将元素翻转:需要头文件#include<algorithm>
reverse(v.begin(),v.end());将元素翻转
(2)使用sort排序:需要头文件#include<algorithm>,
sort(v.begin(),vec.end());(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool cmp(const int &a,const int &b)
{
return a>b;
}
调用时:sort(v.begin(),v.end(),cmp),这样就降序排序。
7.二分查找的知识:
iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。
还可以顺便排序,只要末尾加上个cmp函数就好了
now为当前数据的时候
it=upper_bound(v.begin(),v.end(),now,cmp);
如果cmp是升序排列
代表按照函数cmp的顺序排好序后二分查找大于now的第一个迭代器
8.关于stl堆的一些知识:
make_heap(a,a+n)a可以是任何类型的数组,用来建堆,不过如果不是基础类型的话就要重载小于号,基础类型不重载默认为最大堆,a[0]就为堆顶,a[n-1]为末尾
用push_heap(a,a+n)作用就是更新堆
pop_heap(a,a+n)作用是将堆顶移到堆的尾部就是a[n-1]处,其他地方保持堆的形状,这些东西如果不是堆就不能用
9.常用的字符串函数
包含文件:string.h
函数名: strstr!!神器,比KMP会慢上一些,最多复杂度n方,但是可以省去很多KMP的代码,偷懒必备
函数原型:extern char *strstr(char *str1, char *str2);
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。
如果没找到就会返回NULL
包含文件:string
函数名:substr
用法:
string s;s.substr(i,j)会返回一个s串中从i开始的j位的string类字符串
包含文件:string
函数名:find
用法:
string s1,s2;s1.find(s2)如果找到会返回该串的开始位置,没找到返回string::npos;
10.set的用法
set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。
set的各成员函数列表如下:
1. begin()--返回指向第一个元素的迭代器
2. clear()--清除所有元素
3. count()--返回某个值元素的个数
4. empty()--如果集合为空,返回true
5. end()--返回指向最后一个元素的迭代器
6. equal_range()--返回集合中与给定值相等的上下限的两个迭代器
7. erase()--删除集合中的元素
8. find()--返回一个指向被查找到元素的迭代器
9. get_allocator()--返回集合的分配器
10. insert()--在集合中插入元素
11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
12. key_comp()--返回一个用于元素间值比较的函数
13. max_size()--返回集合能容纳的元素的最大限值
14. rbegin()--返回指向集合中最后一个元素的反向迭代器
15. rend()--返回指向集合中第一个元素的反向迭代器
16. size()--集合中元素的数目
17. swap()--交换两个集合变量
18. upper_bound()--返回大于某个值元素的迭代器
19. value_comp()--返回一个用于比较元素间的值的函数
对于结构体可以重载小于号使得按照要求来排序11.链表list
不常用,基本手写,直接找博客吧就不总结了http://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html