多重集合
在一个集合中一个元素只能出现一次,而在多重集合中一个元素可以出现多次。
一个元素在多重集合中出现的次数为这个元素的重数(或重次、重复度)。
在c++中,multiset在头文件里定义,和set集合一样,这里不再过多赘述。
erase函数的用法
下面来看一个具体的例子
multiset<int> m;
m.insert(3); //添加3后为{3}
m.insert(10); //添加10后为{3,10}
m.insert(8); //添加8后为{3,8,10}
m.insert(5); //添加5后为{3,5,8,10}
m.insert(3); //添加3后为{3,3,5,8,10}
m.erase(3); //删除3后为{5,8,10}
m.erase(8); //删除5后为{8,10}
m.erase(10); //删除10后为{8}
删除单个元素的方法
那么问题来了,我们如何在multiset中只删除一个数字呢?
新函数find(x)
multiset<int> m;
m.insert(3); //添加3后为{3}
m.insert(10); //添加10后为{3,10}
m.insert(8); //添加8后为{3,8,10}
m.insert(5); //添加5后为{3,5,8,10}
m.insert(3); //添加3后为{3,3,5,8,10}
multiset<int> :: iterator it;
it=m.find(3); //it指向第一个3的位置
cout<<*it; //输出3
it=m.find(6); //此时it为尾后迭代器m.end()
之前用的erase函数,现在加上find函数后便可以只减掉一个数字了 。
multiset<int> m;
m.insert(3); //添加3后为{3}
m.insert(10); //添加10后为{3,10}
m.insert(8); //添加8后为{3,8,10}
m.insert(5); //添加5后为{3,5,8,10}
m.insert(3); //添加3后为{3,3,5,8,10}
cout<<m.count(3); //共有2个3,输出2
m.erase(m.find(3));//删掉1个3后为{3,5,8,10}
cout<<m.count(3); //共有1个3,输出1
输出结果
2
1
讲完find函数后,还有两个函数和find很相似,分别是upper_bound和lower_bound,复杂度都是O(log n),这两个在set和multiset中也都可以用。
multiset<int> m;
m.insert(3); //添加3后为{3}
m.insert(10); //添加10后为{3,10}
m.insert(8); //添加8后为{3,8,10}
m.insert(5); //添加5后为{3,5,8,10}
m.insert(3); //添加3后为{3,3,5,8,10}
cout<<*m.upper_bound(3)<<endl;
//第一个大于3的数字是5
cout<<*m.lower_bound(3)<<endl;
//第一个大于等于3的数字是3
输出结果
5
3