什么时候需要用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的话,代码如下:
-
- int numPrimeFactors = 0;
- for (auto iter = primeFactorMap.begin(); primeFactorMap.end() != iter; ++iter)
- {
- numPrimeFactors += iter->second;
- }
for循环执行完后的numPrimeFactors才是我们想要的结果。
如果用multiset,我们只需要调用primeFactorMultiset.size()。
-
我们想打印出2 2 2 3 5这样的序列。
-
用map要两重循环:
- for (auto iter = primeFactorMap.begin(); primeFactorMap.end() != iter; ++iter)
- {
- for (int i = 0; i < iter->second; ++i)
- {
- cout << iter->first << ' ';
- }
- }
用multiset只要一重循环,代码又简洁了一点:
- for (auto iter = primeFactorMultiset.begin(); primeFactorMultiset.end() != iter; ++iter)
- {
- cout << *iter << ' ';
- }