一, 什么是STL?

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。

二, STL常用容器。


1. queue

queue就是队列,是一种先进先出的容器(First In First Out,简称FIFO),

  • 引用需要头文件:

#include < queue >

  • 声明格式:

queue< int > q1;

  • 常用方法:
q.size();         //返回q里元素个数
q.empty(); //返回q是否为空,空则返回1,否则返回0
q.push(k); //在q的末尾插入k
q.pop(); //删掉q的第一个元素,不返回
q.front(); //返回q的第一个元素
q.back(); //返回q的末尾元素

2. deque

deque(Double Ended Queues,双向队列)和队列很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)

  • 引用头文件:

#include < deque >

3. priority_queue

priority_queue为优先队列,是queue的升级版,具有queue的特性,同时可以即时自动排序默认从大到小

  • 引用头文件:

#include < queue >

  • 声明格式:
priority_queue <node> q;        //默认从大到小排序
priority_queue<node, vector<node>, less<node> > //从小到大排序
priority_queue<node, vector<node>, greater<node> > //从小到大排序
  • 自定义比较关键字的声明格式:
struct node
{
int x,y;
bool operator > (const node & a) const
{
return x>a.x; //以x为关键字排序,
}
}k;
priority_queue <node, vector<node>, greater<node> > q; //从小到大

struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x; //以x为关键字排序,
}
}k;
priority_queue<node> //默认从大到小
priority_queue<node, vector<node>, less<node> > q; //从大到小

注意:当定义从大到小的排序方式时,重载的是小于号 <。反之,当从小到大时,重载的是大于号 > 。

  • 常用方法:
q.size();   //返回q里元素个数
q.empty(); //返回q是否为空,空则返回1,否则返回0
q.push(k); //在q的末尾插入k
q.pop(); //删掉q的第一个元素
q.top(); //返回q的第一个元素 注意:与queue的front()方法不同

4. vector

vector是C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.

  • 引用头文件

#include< vector >

  • 声明格式

vector< int > s;
vector< node > q;

  • 常用方法
1.push_back       在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据

5. string

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<fstream>
using namespace std;
int main(){

//string 的初始化
string str0,str00;
cin>>str0; cout<<str0<<endl;//cin读入忽略空字符,遇见空格自动停止
getline(cin,str00); cout<<str00<<endl;//不忽略空格,但舍弃换行符
string str1="hello word";
string str2=("my heart go on");
string str3 (str1,5);//str3表示str1从第五个开始的之后的所有字符(不包含第 5个字符)
string str4 (str1,5,3);//str3表示str1从第五个开始的之后的3个字符(不包含第 5个字符)
char s[]={"bits/stdc++.h"};
string str5=s;
string str6 (s);
string str7 (s,4);//==bits 和str3不一样
string str8 (10,'a');
cout<<str1<<endl<<str2<<endl<<str3<<endl<<str4<<endl;
cout<<s<<endl<<str5<<endl<<str6<<endl<<str7<<endl<<str8<<endl;

//赋值,拼接字符串
string str9="C18H20FN3O4";
string str10="你好";
string str11=str9+str10;//直接做加法拼接
cout<<str11<<endl;
cout<<str10+str9<<endl;

str9.push_back('.');//加入单字符,不能加入字符串
cout<<str9<<endl;

str9.append("you can see C18H20FN3O4.");//加入字符串
cout<<str9<<endl;

str9.assign("dreams come true");//重新赋值
cout<<str9<<endl;

str9.insert(14,"!!!!!");//在指定位置插入字符串,是插入,不是覆盖
cout<<str9<<endl;

//string 的访问
string str12="C++isdifficult";
cout<<str12[2]<<" "<<str12[6]<<" "<<str12.at(0)<<endl;//下标从0开始

//可以使用 STL 的接口
string str13;
str13="GFBACED";
string::iterator itstr=str13.begin();
for( ;itstr!=str13.end();itstr++){//遍历
cout<<*itstr;
}
cout<<endl;
sort(str13.begin(),str13.end());//可以快排
cout<<str13<<endl;

/*
比较操作 == != > >= < <= compare 等string的比较操作,按字符在字
典中的顺序进行逐一比较。在字典前面的字符小于后面的字符。
*/
string str14="ABCDEF";
string str15="ABCD";
string str16="BA";
if(str14<str15) cout<<"str14<str15";
else cout<<"str15<str14"<<endl;
if(str14<str16) cout<<"str14<str16";
else cout<<"str16<str14"<<endl;

//string 可以直接排序
string str17[10];
for(int i=1;i<=5;i++) cin>>str17[i];
sort(str17+1,str17+5+1);
for(int i=1;i<=5;i++) cout<<str17[i]<<endl;


//字符查找
string str18="i am a student,and i am 16 years old";
string::size_type pos;
pos=str18.find("am");
if(pos!=str18.npos)
cout<<"第一次出现的下标是:"<<pos<<endl;//下标从 0开始
pos=str18.find("am",10);
cout<<"在下标10之后第一次出现的下标是"<<pos<<endl;

string str19="i";
pos=str18.rfind(str19);//反向查找
cout<<"反向中第一次出现的位置"<<pos<<endl;


//字符交换
string str19="www.baidu.com";
string str20="www.google.com";
str19.swap(str20);//交换
cout<<str19<<" "<<str20<<endl;
str19.erase();//删除整个字符串
str20.clear();//清空字符容器中所有内容
cout<<str19<<" "<<str20<<endl;
//字符串反转
str2 = reverse(str1.begin(), str1.end());

return 0;
}