关于对set容器的进一步理解
·
在初次学习set这个容器的时候真是快把我折磨死了
因为stl的容器都有一堆稀奇古怪的声明方式和使用方式
不过在学习了一段时间后,我发现这些容器的很多函数居然是相通的
也就是说我可以不用费尽心思去背那么多函数哈哈哈哈
关于我上一个关于set容器的学习内容,那一片段写的太水了,这次得写详细点
首先set容器的底层实现机制是红黑树,但是我们在使用的时候压根不用管这个容器的底层实现机制是什么,那样反而会干扰我们对容器的理解
简而言之 set是一个集合 自带排序 去重
也就是说我可以不用使用sort也可以排序了
正好关于数组的去重方式我学的也不是很好
set可以帮我一次性搞定
在打了一堆比赛后,我终于发现了关于set的一个妙用
那就死可以用来算出一个数组的mex
具体实现是这样的
int mex(vector<int> a){
set<int> st;
int ans = 0;
int n = a.size();
for (int i = 0; i < n;i++){
st.insert(a[i]);
}
while(st.count(ans)){
ans++;
}
}
这个方法在我眼中颇为神奇
首先是这个函数,我才知道函数的传参是可以用数组的
其次是这个count函数
在我学习这个函数之前,我一直拿这个当做计数器的变量
用在set容器里面可以返回一个size_t变量 用于判断该容器是否有这个数
(刚开始那会我还以为是返回一个布尔变量)
逻辑方面 每当count检测到该容器里面出现过该数 那么就会让ans进行自增操作
也刚好满足了mex的定义
见识到了set容器的妙用后
以后遇到各种算法问题总是想着用set套一套
倒是有点滥用了
其次便是其他函数 比如insert
这个函数我一开始以为可以用push_back函数替代
后来一想 反正插入进去以后就要开始排序嘛
压根就没有尾插这个概念
不过令我惊讶的是set容器不能通过下标访问
估计是因为底层是红黑树的原因吧
(不过我记得二叉树也是可以用数组来存储来着)
(也不知道为什么数据结构之间的关系怎么那么复杂,全用并列关系不好嘛)
更多推荐


所有评论(0)