multiset在c++中是一个常用的set库中类型,他的有用之处在于可以实现可重复的集合set,这使得一些算法操作可以由此变得简单许多;
例如将一些元素增加进set集合 : 9 2 4 4 5 6 8 8 。(使用insert函数)
#include <iostream>
#include <set>
using namespace std;
void solve() {
int a[8] = {9 , 2 , 4 , 4 , 5 , 6 , 8 , 8};
multiset<int>se;
for(int i = 0;i < 8;i++) {
se.insert(a[i]);
}
for(auto i : se) {
cout << i << " ";
}cout << "\n";
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _ = 1;
// cin>>_;
while(_--)
{
solve();
}
}
则set中集合为{2 , 4 , 4, 5, 6 , 8 ,8 , 9}(print结果)。
multiset的使用跟set没什么区别 set.insert() 。插入
set.erase(begin , end) or (itrator)。 删除(return 删除后的位置
set.find(key)。 查找操作 (return iterator)
set.lower_bound(key)。查找第一个大于等于的key (return iterator)
set.upper_bound(key)。查找第一个大于的key
set.size()。set中元素的个数 return int
set.count(key) 。查找一个元素的个数 与set不同,set一般是返回1或0
现在重点讲述multiset中的erase函数和equal_range函数
Multiset.erase(key)
multiset中的erase函数是一个易混淆的点。
在multiset的源码中erase是有重载函数的,因为重载的优先性是 (具体参数 显式具现化 重载模板),所以,如果输入的是迭代器的话是进行第一个划线函数(删除对应的迭代器),如果输入的是值的话进行第二个划线函数(删除对应的所有值)。
下面用具体实例来解释
在上述例子中如果进行erase(4)的话,结果是{2 , 5, 6 , 8 ,8 , 9}
如果进行erase(find(4))的话,结果是{2 ,4 , 5, 6 , 8 ,8 , 9}
很容易看出来erase(4)是删除了multiset中的所有4,而erase(find(4))是删除一个4;
Multiset.equal_range
equal_range返回的是两个迭代器,用pair<iterator,iterator>来接收,该函数返回的是对应的容器中所有等于key的键的元素的范围; {2 , 4 , 4, 5, 6 , 8 ,8 , 9}中
pair<iterator,iterator> _range = se.equal_range(4);
_range.first为第一个值4的迭代器,_range.second为最后一个4的迭代器
初到掘金,请多多支持qaq