STL简介
STL中的几个基本概念
sort 的使用
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a[5];
for(int i=0; i<5; i++) scanf("%d",&a[i]);
sort(a,a+5); //默认从小到大排
for(int i=0; i<5; i++) printf("%d ",a[i]);
}
多关键字排序
struct node{
int x,y;
}p[4]; //定义结构体
bool cmp(node a,node b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
} //自定义比较函数,x为主要关键字,y为次要关键字
int main()
{
for(int i=0; i<4; i++) scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+4,cmp);
//参数分别为起始位置,终止位置后一个位置,自定义比较函数
for(int i=0; i<4; i++) printf("%d %d\n",p[i].x,p[i].y);
}
STL标准容器类简介
名称 | 准容器类 | 说明 |
顺序性容器 | ||
字符串 | string | 提供了比c语言更多的接口,使用起来也比c++方便的多 |
动态数组 | vector | 从后面快速的插入与删除,直接访问任何元素 |
双端队列 | deque | 从前面或后面快速的插入与删除,直接访问任何元素 |
列表 | list | 双链表,从任何地方快速插入与删除 |
关联容器 | ||
集合 | set | 快速查找,不允许重复值 |
多重集合 | multiset | 快速查找,允许重复值 |
映射 | map | 一对一映射,基于关键字快速查找,不允许重复值 |
多重映射 | multimap | 一对多映射,基于关键字快速查找,允许重复值 |
容器适配器 | ||
栈 | stack | 后进先出 |
队列 | queue | 先进先出 |
优先队列 | priority_queue | 最高优先级元素总是第一个出列 |
字符串 string
string是c++中表示字符串的容器,其底层的字符串表示方式仍然是以’\0’表示的字符串集合但是提供了比c语言更多的接口,使用起来也比c++方便的多。
常用:字符串模拟
string的基本操作
基本操作 | 具体实现 |
新建 | string s; |
字符串比较 | > >= < <= == != |
尾部插入元素 | s.append("***"); |
在指定位置前插入 | s.insert(2,"abs"); |
从指定位置开始,删除连续的n个字符 | s.erase(x,len); |
位置x开始长度为len的部分,替换成str | s.replace(x,len,str); |
使用下标访问元素 | for(i=0;i<s.size();i++) cout<<s[i]<<endl |
转换为c中的字符串 | printf(“%s\n”,s.c_str()); |
求元素个数 | s.size() |
清空 | s.clear() |
vector的基本操作
基本操作 | 具体实现 |
创建 | vector<int>vec |
创建对应迭代器 | vector<int>::iterator it |
尾部插入元素 | vec.push_back(a) |
对应位置插入元素 | vec.insert(vec.begin()+i,a) (在i位置插入a,i后面的元素后移) |
删除元素 | vec.erase(vec.begin()+2) (删除vec[2]) |
删除最后一个元素 | vec.pop_back() |
使用下标访问元素 | for(i=0;i<vec.size();i++) cout<<vec[i]<<endl |
使用迭代器访问元素 | for(it=st.begin();it!=st.end();it++) cout<<*it<<endl |
求元素个数 | it.size() |
清空 | it.clear() |
e.g.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int main(){
vector<int> a;
a.clear(); //清空
for(int i=0; i<5; i++){
a.push_back(i); //把元素i按顺序放到a里
}
for(int i=0; i<a.size(); i++) //a.size()测量a的元素个数
printf("%d ",a[i]);
puts("");
vector<int>::iterator it; //vector容器指针
it=a.begin(); //指向第一个元素
a.erase(it+2); //删除第三个
for(int i=0; i<a.size(); i++)
printf("%d ",a[i]);
}
set是一种关联式容器, 作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。需要注意的是,set不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素。
常用:可以插入很多值,去掉重复元素,并可以排序、查询
set的基本操作
基本操作 | 具体实现 |
创建 | set<int>st |
创建对应迭代器 | set<int>::iterator it |
插入元素 | st.insert(a) |
删除某元素 | st. erase(a) |
删除迭代器指向的元素 | st.erase(it) |
查找元素 | it=st.find(a) (返回值为一个迭代器) |
查找第一个不小于目标的值 | it=lower_bound(a) (返回值为一个迭代器) |
查找第一个大于目标的值 | it=upper_bound(a) (返回值为一个迭代器) |
使用迭代器访问元素 | for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl |
求元素个数 | st.size() |
清空集合 | st.clear() |
lower_bound、up_bound图示
映射 map
<关键字,关键字的映射>
定义方式为map<string, double> stu (实现字符串到数字的映射)
插入一个新的学生可以简单表示为stu[“张三”] = 90.5、
常用:字符串hash
map的基本操作
e.g.
#include<iostream>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
int main(){
map<string,int> mp;
mp.clear(); //清空
string nm[]={"abc","david","lucy","abc","app","lucy"};
int index=1;
for(int i=0; i<6; i++) {
if(mp[nm[i]]==0) mp[nm[i]]=index++;
//判断是否已经出现过,没出现过,就编号
}
map<string,int>::iterator it; //map容器的指针
for(it=mp.begin(); it!=mp.end(); it++){
cout<<it->first<<" "<<it->second<<endl;
//按字典序输出每个的编号
}
}
实践的重要性。