zoukankan      html  css  js  c++  java
  • mutiset的简单介绍转载

    原文链接:https://blog.csdn.net/sodacoco/article/details/84798621

           c++语言中,multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数

    简单应用:

    通过一个程序来看如何使用multiset:

    1. #include <string>
    2. #include <iostream>
    3. #include <set>
    4. using namespace std;
    5. void main(){
    6.     intx;
    7.     scanf("%ld",&x);
    8.     multiset<int>h; //建立一个multiset类型,变量名是h,h序列里面存的是int类型,初始h为空
    9.     while(x!=0){
    10.         h.insert(x); //将x插入h中
    11.         scanf("%ld",&x);
    12.     }    
    13.     while(!h.empty()){ // 序列非空 h.empty()==true时 表示h已经空了
    14.         __typeof(h.begin()) c=h.begin();
    15. //c指向h序列中第一个元素的地址,第一个元素是最小的元素
    16.         printf("%ld ",*c); //将地址c存的数据输出
    17.         h.erase(c); //从h序列中将c指向的元素删除
    18.     }
    19. }

    对于输入数据:32 61 12 2 12 0,该程序的输出是:2 12 12 32 61。  

    放入自定义类型的数据:

    不只是int类型,multiset还可以存储其他的类型诸如 string类型,结构(struct或class)类型。而我们一般在编程当中遇到的问题经常用到自定义的类型,即struct或class。例如下面的例子:

    1. struct rec{
    2.     int x,y;
    3. };
    4. multiset<rec>h;

    不过以上的代码是没有任何用处的,因为multiset并不知道如何去比较一个自定义的类型。怎么办呢?我们可以定义multiset里面rec类型变量之间的小于关系的含义(这里以x为第一关键字为例),具体过程如下:

    定义一个比较类cmp,cmp内部的operator函数的作用是比较rec类型a和b的大小(以x为第一关键字,y为第二关键字):

    1. struct cmp{
    2.     bool operator()(const rec&a,const rec&b){
    3.         return a.x<b.x||a.x==b.x&&a.y<b.y;
    4.     }
    5. };

     然后将语句"multiset<rec>h ;”改成"multiset<rec,cmp>h;"这样以后,我们就告诉了序列h如何去比较里面的元素(重载运算符)

    此时rec以及multiset的定义部分完整代码可参考如下:

    1. struct rec{
    2.     int x,y;
    3. };
    4. struct cmp{
    5.     bool operator()(const rec&a,const rec&b){
    6.         return a.x<b.x||a.x==b.x&&a.y<b.y;
    7.     }
    8. };
    9. multiset<rec,cmp>h;

    通过以上代码,能够建立一个集合h使得该集合能够存储和排序自定义类型

    常用函数总结:

    构造、拷贝、析构

    操作

    效果

    set c

    产生一个空的set/multiset,不含任何元素

    set c(op)

    以op为排序准则,产生一个空的set/multiset

    set c1(c2)

    产生某个set/multiset的副本,所有元素都被拷贝

    set c(beg,end)

    以区间[beg,end)内的所有元素产生一个set/multiset

    set c(beg,end, op)

    以op为排序准则,区间[beg,end)内的元素产生一个set/multiset

    c.~set()

    销毁所有元素,释放内存

    set<Elem>

    产生一个set,以(operator <)为排序准则

    set<Elem,0p>

    产生一个set,以op为排序准则

    非变动性操作

    操作

    效果

    c.size()

    返回当前的元素数量

    c.empty ()

    判断大小是否为零,等同于0 == size(),效率更高

    c.max_size()

    返回能容纳的元素最大数量

    c1 == c2

    判断c1是否等于c2

    c1 != c2

    判断c1是否不等于c2(等同于!(c1==c2))

    c1 < c2

    判断c1是否小于c2

    c1 > c2

    判断c1是否大于c2

    c1 <= c2

    判断c1是否小于等于c2(等同于!(c2<c1))

    c1 >= c2

    判断c1是否大于等于c2 (等同于!(c1<c2))

    特殊的搜寻函数

      sets和multisets在元素快速搜寻方面做了优化设计,提供了特殊的搜寻函数,所以应优先使用这些搜寻函数,可获得对数复杂度,而非STL的线性复杂度。比如在1000个元素搜寻,对数复杂度平均十次,而线性复杂度平均需要500次。

    操作

    效果

    count (elem)

    返回元素值为elem的个数

    find(elem)

    返回元素值为elem的第一个元素,如果没有返回end()

    lower _bound(elem)

    返回元素值为elem的第一个可安插位置,也就是元素值 >= elem的第一个元素位置

    upper _bound (elem)

    返回元素值为elem的最后一个可安插位置,也就是元素值 > elem 的第一个元素位置

    equal_range (elem)

    返回elem可安插的第一个位置和最后一个位置,也就是元素值==elem的区间

    赋值

    操作

    效果

    c1 = c2

    将c2的元素全部给c1

    c1.swap(c2)

    将c1和c2 的元素互换

    swap(c1,c2)

    同上,全局函数

    迭代器相关函数

      sets和multisets的迭代器是双向迭代器,对迭代器操作而言,所有的元素都被视为常数,可以确保你不会人为改变元素值,从而打乱既定顺序,所以无法调用变动性算法,如remove()。

    操作

    效果

    c.begin()

    返回一个随机存取迭代器,指向第一个元素

    c.end()

    返回一个随机存取迭代器,指向最后一个元素的下一个位置

    c.rbegin()

    返回一个逆向迭代器,指向逆向迭代的第一个元素

    c.rend()

    返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置

    安插和删除元素

      必须保证参数有效,迭代器必须指向有效位置,序列起点不能位于终点之后,不能从空容器删除元素。

    操作

    效果

    c.insert(elem)

    插入一个elem副本,返回新元素位置,无论插入成功与否。

    c.insert(pos, elem)

    安插一个elem元素副本,返回新元素位置,pos为收索起点,提升插入速度。

    c.insert(beg,end)

    将区间[beg,end)所有的元素安插到c,无返回值。

    c.erase(elem)

    删除与elem相等的所有元素,返回被移除的元素个数。

    c.erase(pos)

    移除迭代器pos所指位置元素,无返回值。

    c.erase(beg,end)

    移除区间[beg,end)所有元素,无返回值。

    c.clear()

    移除所有元素,将容器清空

    不一样的烟火
  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11377906.html
Copyright © 2011-2022 走看看