STL的set中如何找第k大数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL的set中如何找第k大数?相关的知识,希望对你有一定的参考价值。

要logN的算法。。勉强实现我也可以,但那还不如我自己写RBT呢,求教

参考技术A STL的set不支持这个操作
自己写平衡树吧本回答被提问者采纳
参考技术B 个人觉得可以使用STL的set,利用迭代器实现。先给迭代器赋值为set的begin,然后利用advance函数使迭代器偏移,找第k大的数就偏移(k-1)就可以了,然后访问。

stl之set的用法

1 set介绍
(1)set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型,红黑树的啥东西),基本功能与数组相似。
(2)set与数组不同的是,在set中每个元素的值都是唯一的。
(3)而且set插入数据时,能够根据元素的值自动进行排序。
(4)set中数元素的值并不能直接被改变。
2,简单函数使用。

begin()        ,返回set容器的第一个迭代器

end()      ,返回set容器的最后一个迭代器

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

count()              ,返回集合中某个值的元素个数。比如count(3),返回集合中值为3的集合的个数。
3,实际操作使用案例

0. 定义一个set容器

  • step1:using namespace std;
  • step2:直接set<成员类型>成员名

例如:定义一个整型的set容器叫做cc,那么直接set<int> cc就行了

1. insert操作

作用:往你定义的set里面加上一个数。

  • step1:定义一个辅助变量tmp;
  • step2:输入tmp;
  • step3:将tmp放进你定义的set容器里面。

例如:往刚定义的cc里面放一个tmp,那么直接:cc.insert(tmp)即可。


 

2. clear操作

作用:清空你的set容器。

  • step1:将你的set容器清空。

例如:将刚才定义的cc清空,则为:cc.clear()即可。


 

3. empty判断

作用:判断你的容器是否为空。

  • step1:判断你的容器是否为空。

例如:判断cc是否为空,只需 if(cc.empty())  即可,判断是否非空,只需if (!cc.empty())。

额这块解释一下应该,empty()为空的话应该返回的是1,不为空的话返回0.

我觉得你可以测试下。


 

4. size询问

作用:询问你的容器里有多少个元素。

例如:询问cc的大小,只需 printf("%d ",cc.size())即可。

特别的,size返回的是非重复元素,而不是所有元素。

例如:

cc里面有{1 2 3 4 5 6 7 8} 8个元素,那么他的返回值是8;

cc里面有{1 1 1 1 1 1 1 1} 8个元素,那么他的返回值是1;

cc里面有{1 1 1 2 2 6 2 1} 8个元素,那么他的返回值是3。

额,这里面不是不允许有重复值嘛。。。


 

5. begin,end和对set容器的遍历

这个东西的确有点难……

首先,如果你要对一个set容器进行遍历的话,你要多开两个迭代器,然后以这两个迭代器分别为头和尾遍历。

如果你要对cc进行一次遍历输出,下面是具体操作步骤:

step1:定义两个东西:①set<int>::iterator starti = cc.begin();②set<int>::iterator endi = cc.end();

step2:进行一次遍历:

for (;starti!=endi;starti++)
{
    printf("%d
",*starti);
}

因为begin()和end()返回的都是第一个或者最后一个元素的地址,所以我们在输出的时候就要加个指针*,表示指向该地址存放的元素。

当然,begin()和end()还有其它的用处,具体的就在刷题过程中领悟吧。

重点提示:循环的时候,不能写成starti<=endi,因为这里面没有重载<=的符号,只有!=。


 6. max_size询问

询问的是这个set容器的最大存放量。

这东西好像没什么用QAQ……

首先定义一个叫cc的set容器,然后直接询问cc.max_size()就行啦。

以上是关于STL的set中如何找第k大数?的主要内容,如果未能解决你的问题,请参考以下文章

无序数组中找第k大的数

c++ stl set 中find方法是如何实现的

Codeforces Round #590 (Div. 3)

两个有序数组中找第k大的数

两个有序数组中找第k大的数

每天学习亿点点day 17: Boyer-Moore 算法和找第K大的数