set 和 multiset 的区别

原创:https://blog.csdn.net/weixin_35909255/article/details/70757138

multiset:多重集合,其实就是 set 集合的扩展版。

唯一的不同是 set 集合中一个值只能出现一次,

而多重集合中一个值可以出现多次。

 

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

    • set::insert(key)的返回值是一个pair<iterator, bool>,其中pair中的bool成员表明了key被插入之前,set中是否已存在相同的key;也就是说,如果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?

需要随时往容器中插入元素,随时对元素进行快速查找,又需要按某种顺序对元素进行遍历的时候.

扫描二维码关注公众号,回复: 1018438 查看本文章


举个例子:

假设我们需要将一个很大的数n分解为多个质数因子的乘积,并将这些质数因子存储在容器中,供以后查询和遍历用。比如对于n = 120 = 2 x 2 x 2 x 3 x 5,我们可以将它的质数因子存储为primeFactorMultiset = { 2, 2, 2, 3, 5 }。


当然也可以用map,将质数因子本身存为key,将该因子的出现次数存为value。(假定我们已经把它们都存进去了)(1)现在我们想知道n可以分解为多少个质数因子的乘积。如果用map的话,需要用for循环来累加我们所有的元素个数,

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


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

用map要两重循环:

  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.     }  


用multiset只要一重循环:

  1. for (auto iter = primeFactorMultiset.begin(); primeFactorMultiset.end() != iter; ++iter)  
  2. {  
  3.     cout << *iter << ' ';  
  4. }

猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/80041674