STL中的数据结构
STL数据结构:
#include
stack<int> s;//定义元素为int空栈
s.empty();//查询栈是否空,若非空返回假,若空则返回真
s.push(5);//将5添加到栈顶
s.top();//查询栈顶元素,在栈为空时会出错
cout<<s.top();
s.pop();//清除栈顶元素,在栈为空时会出错
s.size();//查询栈中元素数量
#include
队列
queue<int> q;//定义元素为int类型的空队列
q.empty();//查询是否为空,若空则返回真
q.size();//查询队中元素个数
q.push(7);//在队尾加入元素
q.front();//查询队首元素,队空时出错
q.back();//查询队尾元素队,空时出错
q.pop();//清除队首元素,队空时出错
优先队列
struct edge
{
int u,v,w;
bool operator < (const edge &x)const{ //重载运算符
return w>x.w;
}
}e[5005];
int main()
{
priority_queue<int> q;//定义大根堆
priority_queue<int,vector<int>,greater<int>> q1;//定义小根堆
priority_queue<edge> q2;//定于元素为结构体的堆
// 结构体本身无法比较大小,所以必须人为定义比较大小方式
//有趣的是:大根堆在重载运算符时需要重载小于号,小根堆需要重载大于号
//如果重载后编译,编译器突然转跳到一页复杂的源代码,那说明重载运算符有误
q.empty();//查询是否为空,若空则返回真
q.size();//查询堆中元素个数
q.push(7);//元素入堆
q.top();//查询堆顶元素,队空时出错
q.pop();//清除堆顶元素,队空时出错
return 0;
}
#include
向量(动态数组)
vector<int> v;//定义
vector<int> v1(5,1);//创建含5个1的向量
int a[2]={1,2};
vector<int> v2(a,a+2);//创建复制数组a的向量
cout<<v2[0]<<endl;//查询,若尝试查询长度范围之外的元素会出错
v.push_back(1);//在末尾增添元素
v.insert(v.begin()+i,x);//在第i位插入x
v.insert(v.begin()+i,n,x);//在第i位插入n个x
v2.pop_back();//清除末尾元素(在尝试删除不存在的元素时会出错)
v2.erase(v2.begin()+i);//清除第i个元素(在尝试删除不存在的元素时会出错)
v2.clear();//清空元素
向量存图
#include<bits/stdc++.h>
using namespace std;
int u,v,w,m=3;//假设有m条边
//u为起始点,v为目标点,w为边的长度
struct edge
{
int v,w;
};
int main()
{
vector<int> e[100];//动态数组存图(不考虑长度时)
for(int i=1;i<=m;i++){
cin>>u>>v;
e[u].push_back(v);
}
//遍历节点u可以连接的所有目标点
for(int i=0;i<e[u].size();i++)
cout<<e[u][i]<<endl;
//考虑边长度时
vector<edge> e2[100];
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
edge x;x.v=v,x.w=w;
e2[u].push_back(x);
}
for(int i=0;i<e2[u].size();i++)
cout<<e2[u][i].v<<" "<<e2[u][i].w<<endl;
return 0;
}
#include
map以一颗红黑树为底层可以以O(logn)速度实现快速匹配
例1:有编号为从1到10000个n个同学,他们分别来自1到200班,现需要你编写一个程序:
~该程序输入共 n+m+2行:第一行输入学生人数n(n<10000)
~之后n行每行输入两个整数,分别为学生编号 所属班级
~第n+2行输入查询次数m(m<10000)
~之后m行每行输入一个学生编号,要求输出该学生所属班级
该题很简单,只需要建立一个int数组,索引为学生编号,对应元素为学生所属班级即可,如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10005];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
a[x]=y;
}
cin>>m;
for(int i=1;i<=m;i++){
int x;
cin>>x;
cout<<a[x];
}
return 0;
}
例2:有姓名为长度20个英文字母以内n个同学,他们分别来自1到200班,现需要你编写一个程序:
~该程序输入共 n+m+2行:第一行输入学生人数n(n<10000)
~之后n行每行输入一个字符串一个整数,分别为学生姓名 所属班级
~第n+2行输入查询次数m(m<10000)
~之后m行每行输入一个学生姓名,要求输出该学生所属班级
问题似乎变得有点负责,因为一般数组不能以字符串作为索引,但是可以通过map解决:
#include<bits/stdc++.h>
using namespace std;
int n,m;
map<string,int> a;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
int y;string x;
cin>>x>>y;
a[x]=y;
}
cin>>m;
for(int i=1;i<=m;i++){
string x;
cin>>x;
cout<<a[x];
}
return 0;
}
map操作:
map<t1,t2> a;//map的定义,t1,t2为任意两种数据类型
a.clear();//清空map
本文来自博客园,作者:STEllIAF0X,转载请注明原文链接:https://www.cnblogs.com/STEllIAF0X/p/15068170.html