在初次学习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容器不能通过下标访问

估计是因为底层是红黑树的原因吧

(不过我记得二叉树也是可以用数组来存储来着)

(也不知道为什么数据结构之间的关系怎么那么复杂,全用并列关系不好嘛)

更多推荐