多重集合multiset


多重集合

在一个集合中一个元素只能出现一次,而在多重集合中一个元素可以出现多次

一个元素在多重集合中出现的次数为这个元素的重数(或重次、重复度)。

在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_boundlower_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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值