LCY算法培训-进阶班-第1讲(STL在竞赛中的应用)
本文最后更新于:December 3, 2021 pm
2021杭电ACM-LCY算法培训进阶班知识总结。STL在竞赛中的应用PPT内容整理。、、
知识目录
相关头文件
| #include<bits/stdc++.h>//万能头文件
|
迭代器
1.队列(queue)
1)特点
| 1.先进先出(FIFO) 2.从队头删除元素 3.在队尾加入元素
|
2)常见操作
| 创建队列对象 queue<元素类型> 队列名; queue<int> qq;
|
| 1.判断队列是否为空 队列名.empty(); qq.empty();
|
| 2.查询队列大小 队列名.size(); qq.size();
|
| 3.访问队首元素 队列名.front(); qq.front();
|
| 4.访问队尾元素 队列名.back(); qq.back();
|
| 5.加入元素(在队尾加入) 队列名.push(元素名); qq.push();
|
| 6.删除元素(在队首删除) 队列名.pop(); qq.pop();
|
3)实例
| int a,b,c,d; queue<int> qq; qq.push(1); qq.push(3); qq.push(4); qq.pop(); a=qq.front(); b=qq.back(); c=qq.size(); d=qq.empty();
|
2.优先队列(priority_queue)
1)特点
| 1.在队尾加入元素 2.从队头删除元素 3.每次取出的是具有最高优先权的元素(不一定先进先出) 4.内部的本质是用堆实现的
|
2)常见操作
| 创建队列对象 priority_queue<元素类型> 队列名; priority_queue<int> qq;
|
| 5.删除元素(删除第一个元素) 队列名.pop();
|
3)实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<bits/stdc++.h> using namespace std; int main(){ priority_queue<int> q; int t,a=2,b=5,c=3; q.push(a); q.push(b); q.push(c); while(!q.empty()){ t=q.top(); q.pop(); cout<<t<<endl; } return 0; }
5 3 2
|
3.栈(stack)
1)特点
| 1.先进后出(FILO) 2.从栈顶删除元素 3.从栈顶加入元素
|
2)常见操作
| 创建栈对象 stack<元素类型> 栈名; stack<int> st;
|
说明
| 栈和队列一样,没有clear之类的函数,如果想要清空一个栈,需要循环调用出栈函数
|
3)实例
| stack<int> s; s.push(1); s.push(2); s.push(3); s.pop(); cout<<s.top()<<endl; s.top()+=3; cout<<s.top()<<endl;
|
4.向量,动态数组(vector)
1)向量的定义
| vector<元素类型> 向量名; vector<int> a;
|
2)向量初始化
| vector<int> abc; vector<int> abc(10); vector<int> abc(10,1);
|
3)向量的常见操作
| 6.往尾部添加一个元素 向量名.push_back(值);
|
| 7.删除尾部第一个元素 向量名.pop_back();
|
| 10.翻转向量 reverse(a.begin() , a.end());
|
4)向量的经典应用
| 1.邻接表 struct edge{int from,to,value;} const int maxn=1e5; vector<edge> Map[maxn]; 若用普通二维数组存邻接表,会造成极大浪费(超内存)
for(int i=0;i<maxn;++i) Map[i].clear();
|
5.集合(set)
数学上的集合的三个特征
| 1.确定性(任一元素必须是确定属于或不属于某个集合) 2.互异性(集合中的元素互不相同) 3.无序性(集合中的元素没有先后之分)
|
1)特点
| set的含义就是集合,是一个有序的,没有相同元素的容器,且里面的元素都是排序好的,支持插入,删除,查找等操作,所有的操作都是严格在logn时间内完成,效率非常高
|
2)常见操作
| 4.查询有否元素x int hav = s.count(x);
|
| 5.查找x并返回迭代器 set<int>::iterator it = s.find(x);
|
| 6.判断是否为空集 bool isempty = s.empty();
|
| 7.求集合元素个数 int n = s.size();
|
3)用法注意
| 1.set最主要用途:自动去重并按升序排序 2.如若对set中的元素降序排序,则 set声明 set<int,greater<int> > st; 迭代器也随之改变 set<int,greater<int> >::iterator it; 如若int类型改为结构体时,排序就在结构体中加载小于符号 3.set只能通过迭代器(iterator)访问 4.set不支持 it < st.end() 的写法,可写成 it != st.end()
|
6.string类
1)string对象的声明
| 1.string str; 2.string strl="qwertyuui";
|
2)求string对象的长度
| string strTest="test"; 1. strTest.length(); 2. strTest.size();
|
3)string对象的连接
| 可以使用+和+=运算符对string对象执行字符串的连接操作(还有append成员函数实现字符串连接,忽略之)
|
4)string对象的比较
| 可以用 <、<=、==、!=、>=、> 运算符比较string对象(还有compare成员函数用于比较字符串,忽略之)
|
5)求string对象的字串
| substr 成员函数可以用于求字串(n,m) 调用时,如果省略m或者m超过了字符串的长度,则求出来的字串就是从下标n开始一直到字符串结束的部分 string s1="this is ok"; 1.string s2=s1.substr(2,4); 2.s2=s1.substr(2);
|
6)插入字符串
| insert 成员函数可以在string对象中插入另一个字符串,返回值为对象自身的引用 string s1("Limitless"), s2("00"); 1. s1.insert(2,"123"); 2. s1.insert(3,s2); 3. s1.insert(3,5,'x');
|
7)删除字串
| erase 成员函数可以删除string对象中的字串,返回值为对象自身的引用 string s1("Real Steel"); 1. s1.erase(1,3); 2. s1.erase(5);
|
8)交换两个string对象的内容
| swap成员函数可以交换两个string对象的内容 string s1("West"),s2("East"); s1.swap(s2);
|
9)字符串的查找操作
| string str="The apple thinks apple is delicious"; string key="apple"; 1. int pos1=str.find(key); s.find(str),查找字符串str在当前字符串s中第一次出现的位置 2. int pos2=str.find(key,10); s.find(str,pos),查找字符串str在当前字符串s的[pos,end]中第一次出现的位置,即从pos开始到字符串的最后,str第一次出现的位置
|
10)用STL算法操作string对象
| string s("afgcbed"); sort(s.begin(),s,end()); cout<<s<<endl; next_permutation(s.begin(),s,end()); cout<<s<<endl; reverse(s.begin(),s,end()); cout<<s<<endl;
|
11)String其他有用函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 1. 截取子串 s.substr(pos, n) 截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos) 截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回 2. 替换子串 s.replace(pos, n, s1) 用s1替换s中从pos开始(包括0)的n个字符的子串 3. 查找子串 s.find(s1) 查找s中第一次出现s1的位置,并返回(包括0) s.rfind(s1) 查找s中最后次出现s1的位置,并返回(包括0) s.find_first_of(s1) 查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0) s.find_last_of(s1) 查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0) s.fin_first_not_of(s1) 查找s中第一个不属于s1中的字符的位置,并返回(包括0) s.fin_last_not_of(s1) 查找s中最后一个不属于s1中的字符的位置,并返回(包括0) 4.string转换成char*字符串 1) .data(); 如: string str="abc"; char*p=(char*)str.data();
2) .c_str(); 如: string str="adcd"; char *p=(char*)str.c_str();
|
7.映射(map)
1)特点
| map是一个键值对(key/value)容器,对于迭代器来说,可以修改value,而不能修改key。Map会根据key自动排序 map类型通常可理解为关联数组:可使用键作为下标来获取一个值。关联的本质在于:元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取
|
2)常见操作
| 1.map的定义 map<int,string> m;
|
| 2.返回m中键值等于k的元素的个数(1或0) m.count(k);
|
8.STL中的算法
1)全排序(next_permutation)
| 通常用于生成序列的全排列 int a[]={1,2,3}; do{ cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl; }while(next_permutation(a,a+3)) 1.若当前调用排序已经达到最大字典序,比如321,则函数返回false; 2.修改函数的参数,比如(a,a+2),则可以只对部分长度全排列
|
| next_permutation是如何生成序列的全排列? 1.从最右边开始,两两比较相邻的元素,直至找到右边比左边大的一对,左边那个就是将要被替换的,再从最右边开始找比这个元素大的第一个,交换他们两个. 2.交换之后,翻转交换元素的后面的所有元素 3.比如:1 3 4 6 5 2 => 1 3 5 6 4 2 => 1 3 5 2 4 6
|