zoukankan      html  css  js  c++  java
  • Multiset ------ 多重集合

      Multiset的中文名是多重集合,其实就是集合的扩展版。唯一的不同是集合中一个值只能出现一次,而多重集合中一个值可以出现多次。

      粗略看了看MSDN,在STL中,multiset和set的成员函数声明也是基本一样的,一些需要注意的地方是:

      • set::insert(key)的返回值是一个pair<iterator, bool>,其中pair中的bool成员表明了key被插入之前,set中是否已存在相同的key。根据我在VS2010上的实验结果,如果set中已经存在相同key的元素,那么插入操作是会失败的,新的元素不会被插进去。而multiset::insert的返回值只是一个iterator,插入操作总是会成功的。
      • multiset::count(key)的返回值可能大于1。
      • multiset::size()的返回值是多重集合的势(cardinality),即multiset中元素的个数,而不是值的个数。比如,{1, 1, 2}的size是3,而不是2。
      • multiset::erase(key)会将对应的key全部删掉,所以对{1, 1, 2}调用erase(1)之后,它就变成了{2}。
      • 只要key存在于集合中,set::equal_range(key)的返回值pair<iterator1, iterator2>总是会有++iterator1 == iterator2。但是对multiset来说就不一定了。

     

      什么时候需要用multiset?当然是需要用set,但是又允许重复key存在的时候了。什么时候用set?我的答案是:需要随时往容器中插入元素,随时对元素进行快速查找,又需要按某种顺序对元素进行遍历的时候——如果没有第三项需求的话可以用非标准库的hash_或标准库的unordered_开头的容器。

     

      举一个Wikipedia上的例子:假设我们需要将一个很大的数n分解为多个质数因子的乘积,并将这些质数因子存储在容器中,供以后查询和遍历用。比如对于n = 120 = 2 x 2 x 2 x 3 x 5,我们可以将它的质数因子存储为primeFactorMultiset = { 2, 2, 2, 3, 5 }。当然也可以用map,将质数因子本身存为key,将该因子的出现次数存为value。但是考虑一下下面的需求:

      • 我们想知道n可以分解为多少个质数因子的乘积。如果用map的话,代码如下:
    [cpp] view plain copy
     
    1. int numPrimeFactors = 0;  
    2. for (auto iter = primeFactorMap.begin(); primeFactorMap.end() != iter; ++iter)  
    3. {  
    4.     numPrimeFactors += iter->second;  
    5. }  

    for循环执行完后的numPrimeFactors才是我们想要的结果。

    如果用multiset,我们只需要调用primeFactorMultiset.size()。

      • 我们想打印出2 2 2 3 5这样的序列。

    用map要两重循环:

    [cpp] view plain copy
     
    1. for (auto iter = primeFactorMap.begin(); primeFactorMap.end() != iter; ++iter)  
    2. {  
    3.     for (int i = 0; i < iter->second; ++i)  
    4.     {  
    5.         cout << iter->first << ' ';  
    6.     }  
    7. }  

    用multiset只要一重循环,代码又简洁了一点:

    [cpp] view plain copy
     
    1. for (auto iter = primeFactorMultiset.begin(); primeFactorMultiset.end() != iter; ++iter)  
    2. {  
    3.     cout << *iter << ' ';  
    4. }  
     
     
  • 相关阅读:
    arcpy地理处理工具案例教程-生成范围-自动画框-深度学习样本提取-人工智能-AI
    arcpy地理处理工具案例教程-将细碎图斑按相同属性或相近属性合并相邻图斑
    遥感应用指数整理
    arcpy实例教程-地图图层导出到要素类
    arcpy实例教程-地图范围导出到要素类
    arcpy实例教程-上游流域下游流域查找
    arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
    传统测绘工程和新时代的测绘地理信息工程专业点评
    GIS地理处理脚本案例教程——批量栅格分割-批量栅格裁剪-批量栅格掩膜-深度学习样本批量提取
    excel矩阵运算操作-转置 行列式 相乘 逆阵
  • 原文地址:https://www.cnblogs.com/by-1075324834/p/5155792.html
Copyright © 2011-2022 走看看