现在的位置: 首页 > 综合 > 正文

STL在ACM竞赛中的使用

2018年04月23日 ⁄ 综合 ⁄ 共 3307字 ⁄ 字号 评论关闭

      本文结合小紫书总结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()

    

【上篇】
【下篇】

抱歉!评论已关闭.