论各容器(基础操作)

论各容器(基础操作)

①结构体
应用:
1.当一组数据有多个值,数据类型(“子串变换”)的时候(需要排序)
2.一个变量引申(联系)出多个数据(to,from)
3.广度搜索
3.范围:任何(一般在动规中不使用–太浪费)

优点:
1.定义结构体变量(数组)可以方便存储
2.当面临要给一组数据排序时(序号–防止乱序–双参数“精明的管家”,价值,容量,距离)定义结构体数组写一个排序规则就可以直接使用sort =>更快的取到你需要的值
(排序方便!!!)

struct node{
int p;
int num;
}k[100]; //定义结构体数组
bool r(node a,node b){ //这里要用bool因为并不是要返回一个特定的值,而是一种判断的依据
return a.p>b.p; //判断的依据
}
sort(k+1,k+n,r) //排序

②二维数组
应用:
1.存储图(横纵坐标)
2.存储多种数据
int a[n+1][3];
for(int i=1;i<=n;i++)
{
cin>>a[i][0]>>a[i][1]>>a[i][2];
}
3.范围:常应用于动态规划,图论

缺点:
1.无法使用排序
2.赋初始值就用两层循环(当然也可以定义全局解决)

③一维数组
应用:
1.任何赋值行为
2.特殊范围:数组充当队列,数组充当栈
数组充当队列:

int head=0,tail=1;
int q[n+1];
bool exit[n+1]; //因题而异
while(head<tail){
	head++;
	if(满足条件){
	     tail++;
	     q[head]=x;  //入队
	     exit[x]=1;
	}
}

使用:
1.删除操作:后面的数顶掉要删除位的数
2.插入操作:插入位置后的所有数向后挪一位,最后空出的位置赋值
3.排序操作:sort 冒泡……

④队列(一般用数组充当):
应用:
1.广搜
2.先进先出每次只用一个值
queue <数据类型> q;
⑤栈
应用:
1.初始只需出一个数
2.常用于存个括号,存个符号…(匹配完医嘱出栈)
3.常定义多个
栈:----------------------------------------------- 队列:
定义: stack <数据类型> s(栈名)----- --------queue
入栈:s.push();--------------------------------- push
出栈:s.pop();----------------------------------- pop
获取栈顶:s.top();------------------------------ front
判断是否为空:s.empty()--------------------- empty
获取长度:s.size()------------------------------size

⑥堆(优先级队列)
应用:
需要将一列无序的数字快速调整至有序
一般都是要随着输入或在运算中不断调整输出
“中位数”

⑦vector
优点:可以调用专属的容器,存储不收限制(二维数组只能二维,vector不会)

引用:#include

输入:G.push_back();
查看大小:G.size();

定义1:vector <数据类型> G[100000](名字);
调用1:G[0][1]
注意1:如果vector的G后面有长度,相当于定义了一个一维的vector,所以可以用G[0][1]。

定义2:vector g;
调用2:g[0]
注意2:如果vector的g后面没有长度,只能用1维。

这里举个栗子 例子
在这里插入图片描述
⑧set
作用:去重
set中不允许有重复的数
定义
set s;
输入
s.insert(x);
(x为一个具体的数)
s.size()
这样就可以知道有多少个重复的数了

map 映射
定义时前面一个类型,后面一个容器
定义完map,还要将那个容器定义出来
即一个东西映射出许多东西
map<string,vector> q;
vector v;
v.push_back(“帅”);
v.push_back(“钱”);
[ ]里面是要映射的东西

pair对象
q.insert(pair<string, vector>{“张先生”,v});
vector x = q[“张先生”];
cout<<x[1];

单映射 一对一
map<int,int> m;
m.insert(1,2);

求一组数中最先出现的数

map <int,int> m;
int main(){
	int n;
	cin>>n;
	int maxn=0;
	for(int i=1;i<=n;i++){
		int num;
		cin>>num;
		maxn=max(maxn,num);
		m[num]++;
	}	
	for(int i=1;i<=maxn;i++){
		if(m[i]==1){
			cout<<i;
			break;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值