本文结合小紫书总结STL在ACM竞赛中的使用
1.stringstream字符流,和string类型:
string类具有的优点:可以直接用四则运算符和关系运算符,简化了字符串类型的操作。
string string1="22",string2="11"; string1+=string2; //类似于strcat int length=string1.length(); //类似于strlen,也可以用string.size(); bool judge=string1>string2; //类类似于strcmp
小紫书中例代码详解:
#include<iostream> #include<string> #include<sstream> using namespace std; int main(void){ string str; stringstream ss; while(getline(cin,str)){ //getline函数的返回值是其中的流cin。一旦cin读取错误就是false。 ss<<str; //将string送入流中。 int a,sum=0; while(ss >> a) sum+=a; //当流里没有东西的时候,退出循环。 cout<<sum<<endl; } return 0; }
2.模板:
模板是为了,使类或者函数具有通用型,不仅限于一种数据类型或者一种成员结构。
现定义一个可以任意交换类型的模板(注意模板只能在全局或者命名空间内定义,不可以在main函数或者自定义函数内定义。)
template<class &T> //class为固定关键字,也可以用等效的typename. void swap1(T &a,T &b){ T temp; temp=a; a=b; b=temp; }
3. 容器vector:
vector<int> v; v.begin(); //容器的起始位置 v.end(); //容器最后一个位置后的位置 v.front();v.back(); //返回第一个元素(最后一个元素,但不判断时候存在 v.empty(); //返回是否容器为空 v.clear(); //清空容器 v.erase(m); //删除m位置的数据,并返回下一个数据的地址(m是迭代器) v.erase(m,n); //删除m到n之间的数据,并返回下一个数据的地址 v.push_back(element); //压入一个元素到末端 v.pop_back(); //弹出最后一个元素 v.reserve(100);v.resize(101); //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位 v.size();v.capacity(); //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建 swap(a,b); //交换两个元素的位置如:swap(v[0],v[1]); vector<int> v(10); //创建一个前十个元素为int的容器 vector<string> v(10,string("I")); //使容器的前10个元素都为string型,并且都初始化为I vector<string> v1(v2); //对于已经存在的v2创建一个v1副本 v.insert(place,element); v.insert(place,n,element); //在place(迭代器)位插入n个元素 注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全
总结:vector即具有数组的特性由增加了一些功能十分好,简化代码的函数,还可以通过原生的v.push_back()动态增加长度,十分好用。
4.集合set(特点是不会存在有重复的元素):
#include<set> set<int> s; //创建一个整型集合:s s.insert(element); //插入一个元素,并会自动排序(在没有自定义的情况下,缺省升序排列) s.size(); //当前容器中元素个数 copy(s.begin(), s.end(), ostream_iterator<string>(cout, "\n")); //#include<iterator> 中的函数:输出全部集合中的元素,并在每个元素后面接换行符
5.映射map(关联容器):
#include<map> map<string,int> map1; //创建一个map类型,健(key)为string型,值(value)为int型。是健到值得一种映射。 map1.insert(pair<string,int>("month",1)); //插入一个元素 map1["month"]=1; // 插入一个元素 <span id="transmark">map1.find("month") //查找该健,如果没有找到返回最后一位元素后面的迭代器 map1.count("month") //查找健"month"出现的次数,但是map中健都是单一且按照升序排列的,只有0和1两中情况 //因为map在创建的时候是有序的,所以查找效率是:logn。1,000个数据只需10次查找,1.000,000也不过20次查找 </span>
6.栈stack:
#include<stack> stack<int> stack1; //在是默认以deque为容器的 stack1.push(element); stack1.pop(); stack1.empty(); //是否为空 stack1.size(); //元素个数 stack1.top(); //判断是否为栈顶元素
7.队列queue:
#include<queue> queue<int> queue1; queue1.push(element); //加入队列顶部 queue1.pop(); //弹出队列里第一个元素 queue1.back(); //队列最后一个元素 queue1.front(); //队列第一个元素 queue1.size(); //队列元素个数 queue1.empty; //队列是否为空
8.优先队列priority_queue:
#include<queue> priority_queue<int,vector<int>,less<int>> pqueue1; //默认容器为vector,其中less算子,表示小的先出队 priority_queue<int,vector<int>,greater<int>> pqueue1; //大的先出队 //优先队列与队列相比,只是按照指定的算子将队列内部排序,让后在操作排序后的栈顶元素。<span id="transmark"></span>
9.二元组pair:
#include<iostream> pair<int,int> palce; //定义一个二元组。 palce.first=1; palce.second=2; //对于pair类可以直接用关系运算符,比较规则是:先对第一个元素比较,若第一个元素相等再对第二个元素比较。 //由于可以用比较运算符,可以把pair作为vector的元素,再用sort排序<span id="transmark"></span>
10.全排列函数:next_permutation
#include<algorithm> //要求一个元素全不相同的长度为n的排列的个数是n!个,方法是:先把排列升序排列,然后求,直到next_permutation()的返回值为false(next_permutaion()已经是最后一个排列之后会返回false,其余返回true,如果返回最后一个之还在继续使用就会循环到第一个。) char a[9]={1,2,3,32,36,56,34,24}; sort(a,a+8); do{ cout << a <<endl; }while(next_permutation(a,a+8)); //求前一个全排列:prev_permutation()