STL(standard Template Library 标准模板库)
1.vector(长度可变数组)
- vector 的定义
vector<typename>name;
ps: 如果 typename 是一个STL容器时定义时要在>>符号之间加上空格 -->vector<vector<int> >name;
- vector容器元素的访问
* vector<typename>vi;
* 通过下标访问
vi[index];
* 通过迭代器访问·
vector<typename>::iterator it;
例如:
#include<algorithm>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int>vi;
for(int i=1;i<=5;i++)
vi.push_back(i);
vector<int>::iterator it=vi.begin();
//vi.begin()取vi的首地址
//vi.end()取尾元素的下一个地址,作为迭代器末尾的标志,不储存任何元素
/*for(int i=0;i<5;i++)
printf("%d ",*(it+i));
return 0;*/
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
printf("%d ",*it);
//TODO
}
}
- vector常用函数
1.push_back()在vector末尾添加一个元素
2.pop_back()在vector末尾删除一个元素
3.size()返回vector中储存的元素个数
4.clear()清除所有元素
5.insert(it,i)用来向任意迭代器it处插入一个元素i
6.erase():
用法1:
删除单个元素
erase(it)
用法2:
删除一个区间的所有元素
erase(first,last)即删除[first,last)间的元素
例如:
#include<algorithm>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int>vi;
for(int i=1;i<=5;i++)
vi.push_back(i);
vector<int>::iterator it=vi.begin();
//vi.begin()取vi的首地址
//vi.end()取尾元素的下一个地址,作为迭代器末尾的标志,不储存任何元素
printf("函数操作前\n");
for(int i=0;i<5;i++)
printf("%d ",*(it+i));
//vi.insert(vi.begin(),10);//vector第一个地方插入一个元素
printf("\n");
// vi.erase(vi.begin()+3);//删除第4个元素
//vi.erase(vi.begin(),vi.begin()+3);//删除vi[0],vi[1],vi[2]
printf("函数操作后\n");
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
printf("%d ",*it);
//TODO
}
}
- vector的初始化
下列一段非良构代码
vector<int>data;//未指定容器初始大小
for(int i=0;i<m;i++)
{
cin>>data[i];//会造成程序错误
}
为避免这种情况需RAII(资源获取即初始化)
关于vector的初始化
二维数组数据为0: vector<vector<int>>data(m,vector<int>(n,0));
2.set(set内元素自动排序,且去除重复元素)
- set数组定义
使用头文件#include <set>
set<int>a[100];
set<int>st;
- set数组的访问
只能通过迭代器访问
set::iterator it;
- set的常用函数
1.insert()
2.find(value)返回set中对应值为value的迭代器
3.erase()的用法:
* erase(it) it为所需要的删除元素的迭代器
* erase(value) value为所需删除的元素
* erase(first,last)删除一个区间内所有的元素
4.size()
5.clear()
例子:
#include<set>
#include<stdio.h>
using namespace std;
int main(){
set<int>st;
st.insert(100);
st.insert(3);
st.insert(5);
st.insert(22);
set<int>::iterator it=st.find(5);
printf("%d\n",*it);
}
3. string
- string的定义
头文件#include<string>
-
string中的内容访问
- 通过下标
- 通过迭代器
#include<string> #include<stdio.h> using namespace std; int main(){ string str="abcd"; for(string::iterator it=str.begin();it!=str.end();it++){ printf("%c",*it); //TODO } }
-
string常用函数
1.operator+=
2.campare operator
3.length()/size()
4.insert()用法
insert(pos,str)在pos号位置后插入元素
insert(it,it2,it3)it为原字符串的与插入位置,it2和it3为待插字符串的首尾迭代器
#include<string>
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
string str="abcd";
for(string::iterator it=str.begin();it!=str.end();it++){
printf("%c",*it);
//TODO
}
printf("\n");
string str2="易助平";
//str.insert(2,str2);//在第二个元素之后插入字符串
str.insert(str.begin()+1,str2.begin(),str2.end());
cout<<str;
}
5. erase()函数
str.erase(first,last)
str.erase(pos,length)删除pos号后的length个字符
6.clear()
7.substr(pos,len)返回pos位置后的len个字符
cout<<str.substr(1,4)<<endl;//中文占两个英文位置
8.string::npos被作为find函数返回失败时的返回值,等于-1或者4294967295
9.find()
str.find(str2)如果str2是str的子串,返回其在str中的第一次出现的位置,不是则返回string::npos
str.find(str2,pos)从pos位置后开始匹配
实例:
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int main(){
string str="Thank you for your smile";
string str2="you";
string str3="me";
if(str.find(str2)!=string::npos){
cout<<str.find(str2)<<endl;
//TODO
}
if(str.find(str2,7)!=string::npos){
cout<<str.find(str2,7)<<endl;
//TODO
}
if(str.find(str3)!=string::npos){
cout<<str.find(str3)<<endl;
//TODO
}
else{
cout<<"i knew there is no position for me"<<endl;
}
}
10.replace()
str.replace(pos,len,str2)把str从pos号后开始长度为len的子串替换为str2
str.replace(it1,it2,str2)把str的迭代器[it1,it2)的范围内的子串替换为str2
实例:
#include<iostream>
#include<string>
using namespace std;
int main(){
string str="Maybe you will turn around.";
string str2="will not";
string str3="surely";
cout<<str.replace(str.find("will"),4,str2)<<endl;
cout<<str.replace(str.begin(),str.begin()+5,str3)<<endl;
return 0;
}
4.map(可以将任何基本类型映射到任何基本类型)
- map的定义
map<typename1,typename2>mp;
typename1为映射前数据类型,typename2为映射后数据类型
- map容器内元素的访问
1.通过下标
2.通过迭代
输出按键的从小到大的顺序排列
#include<map>
#include<stdio.h>
using namespace std;
int main(){
map<char,int>mp;
mp['c']=20;
mp['c']=30;//mp['20']被覆盖
mp['r']=80;
mp['m']=100;
mp['j']=200;
printf("%d\n",mp['c']);
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
printf("%c %d\n",it->first,it->second);
//TODO
}
}
- map常用函数解析·
1.find()
2.erase
3.size()
4.clear()
5.queue
- 定义
- 访问
1.通过front()访问首元素,back()访问尾元素
- 函数
1.push()
2.front()和back()
3.empty()
4.pop()
5.size()
6. stack
1.top()
2.empty()
3.push()
4.pop()
5.size()
7. priority_queue
8.pair
记住一句话:Map由一个个pair组成
1.pair<T1,T2> p;(定义)
2.pair<T1,T2> p(v1,v2);//返回一个pair
3.pair<T1,T2> p={v1,v2};
4. make_pair(v1,v2);//返回一个用v1,v2初始化的pair
5.p.first,p.second;//读取数据
9. algorithm下的常用函数
1. max(),min(),abs()
2.swap(x,y)交换x与y的值
3.reverse(it,it2)可以将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围内的元素进行反转
#include<algorithm>
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
int a[10]={10,11,12,13,14,15};
reverse(a,a+4);
for(int i=0;i<6;i++){
//TODO
printf("%d ",a[i]);
}
string str="abcdefg";
reverse(str.begin()+1,str.begin()+6);//将str[1]~str[6]反转
cout<<str;
}
4.next_permutation()
#include<algorithm>
#include<stdio.h>
using namespace std;
int main(){
int a[10]={1,2,3};
do{
printf("%d%d%d\n",a[0],a[1],a[2]);
}while(next_permutation(a,a+3));
}
5.fill()
可以将数组或容器中的某一段区间赋为某个相同的值
6.sort()
sort(首地址,尾地址的下一个地址,比较函数)
Ps:前两个参数必填,比较函数不写,默认对前面的区间进行递增排序
#include<algorithm>
#include<stdio.h>
using namespace std;
int main(){
int a[10]={10,-1,2,34,21,12};
sort(a,a+6);//将a[0]~a[5]从小到大排序
for(int i=0;i<6;i++){
printf("%d ",a[i]);
}
return 0;
}#include<algorithm>
#include<stdio.h>
using namespace std;
bool cmp(int a,int b){
return a>b;
}//cmp
bool cmp(char a,char b){
return a>b;
}
int main(){
int a[10]={10,-1,2,34,21,12};
sort(a,a+6,cmp);//将a[0]~a[5]从小到大排序
for(int i=0;i<6;i++){
printf("%d ",a[i]);
}
printf("\n");
char c[]={'T','W','A','K'};
sort(c,c+4);//按字典序从小到大排序
for(int i=0;i<4;i++){
//TODO
printf("%c ",c[i]);
}
return 0;
}
7.lower_bound()和 upper_bound()
lower_bound(first,last,val)返回第一个大于等于val的位置,数组返回指针,容器返回迭代器
upper_bound(first,last,val)返回第一个小于等于val的位置