先说一下 一边要用到算法的东西一般要加#include<algorithm>头文件
一、栈和队列
1 栈 :一种线性表
特点 后进先出
头文件 #include<stack>
声明 stack< 类型 > sk(变量); 注意 这里的类型 如果是char只能是单个字符 如果要存字符串要用string
- sk.push(); 向里存 写在括号里
- sk.pop(); 出栈 把最上面的出栈(即所谓的先进后出 注意 这里的不能赋值给别的变量 括号里也不能写东西
- data = sk.top(); 取出栈顶的元素赋值给一个变量 (不出栈
- size = sk.size(); 栈里元素的个数
- sk.empty(); 判定栈是否为空
注意 要清空栈 没有函数 要自己写
while(!sk.empty())
{
sk.pop();
}
2 队列
特点 先进先出 (类似于排队买饭
头文件 #include<queue>
声明 queue< 类型 > q(变量);
- q.push(); 向里存 写在括号里
- q.pop(); 出队列 把队首的出队列(即所谓的先进先出 注意 这里的不能赋值给别的变量 括号里也不能写东西
- data = q.front(); 获得队列首的元素赋值给一个变量 (不出队列
- q.back(); 获得队尾的值 同q.front();
- size = q.size(); 队列里元素的个数
- q.empty(); 判定队列是否为空
- q.clear(); 清空队列
3 双端队列
特点 两端都可以进出
头文件 #include<deque>
声明 deque< 类型 > dq(变量);
- dq.push_front(); 向双端队列首存 写在括号里
- dq.push_back(); 向双端队列尾存 写在括号里
- dq.pop_front(); 将双端队列的队首元素出双端队列
- dq.pop_back(); 将双端队列的队尾元素出双端队列
- data = dq.front(); 获得双端队列首的元素赋值给一个变量 (不出双端队列
- q.back(); 获得双端队列尾的值 同q.front();
- dq.empty(); 判定双端队列是否为空
- dq.clear(); 清空双端队列
4 优先队列(暂时不会。。大佬的...
特点 自动按升降序排序
头文件 #include<queue>
priority_queue < 类型 > q; 默认大小排序从大到小
priority_queue < 类型 ,vector <类型>, greater<类型> > q; 默认大小排序从小到大
priority_queue < 类型 ,vector <类型>, less<类型> > q; 默认大小排序 从大到小
- q.push(); 向里存 写在括号里
- q.pop(); 出队列 队首
- data = q.top(); 取出队首的元素赋值给一个变量 (不出栈
- size = q.size(); 队列里元素的个数
- q.empty(); 判定队列是否为空
- 可以用cmp来替代greater less
struct cmp{ bool operator () (const int a,const int b ) const { //这里和正常的cmp写法一样 } };
5 unique( , ) 去重 lower_bound() upper_bound()
6 set
set < 类型 > q; 集合 自带排序 迭代器
q.insert(); 插入
q.erase(); 插入
q.lower_bound();
迭代器 set < 类型 > :: iterator it;
it = q.begain();
for(it = q.begain() ; it ! = q.end() ; it++)
*it
两个查询
it=q.find(); 返回迭代器
q.count(); 返回0或1
运算符重载
6 map
map< 类型,类型 > m;
键 值
迭代器 map < 类型 > :: iterator it;
it = q.begain();
注意这里的类型可以是结构体不过要重新定义他的排序方式 默认类型(例如int long 之类的是定义过的 ) 如果不定义(或者少定义会使得排序和查询过程中的错误)的话结果就不对 一定要每个都说明 !!!!
struct QWE
{
LL a,b,c;
bool operator<(const QWE& tmp) const
{
if(a==tmp.a&&b==tmp.b)
return c<tmp.c;
if(a==tmp.a)
return b<tmp.b;
return a<tmp.a;
}
}
反向迭代器 map< > :: revecs_ iterator it;
for(it = q.rbegain() ; it ! = q.rend() ; it++)
7 strstr() strchr()
做题时候偶然发现的函数在ctring中(string.h中好像也有) 功能是查找第一个串中的第二个串,第二个功能是在第一个串中查找单个字符
//ps 为什么要写呢 因为好像这个函数的速度比kmp和BM快说是o(1) 所以仅供参考
8 说一下c++的string
类似于char [] 的字符串数组 但是可以直接赋值(相当于给字符串定义了一个系统规则使它变得和int之类的类似)
但是只能用cin cout输入输出//可能是我暂时还没找到用scanf 和 printf输入输出的方法
题取子串的函数是:substr(),形式如下:
s.substr(); //返回s的全部内容
s.substr(11); //从索引11往后的子串
s.substr(5,6); //从索引5开始6个字符
把两个字符串结合起来的函数是+。
9 sort();
太菜了 现在才知道sort也能用来排vector
举个例子
vector<int>q;
q.push_back(1);
q.push_back(3);
q.push_back(-2);
sort(q.begin(),q.end());
10 lower_bound()
和sort一样是三个参数除了最后一个是写你要查的什么其他两个和sort一样 返回第一个大于或等于第三个参数的地址
11 next_permutation();
这个函数用来求下一个排列
例
#include<algorithm>
int p[10];
int main()
{
next_permutation(p,p+n);
}