关于c++中multiset的细节用法(erase函数 , equal_range

277 阅读2分钟

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函数是一个易混淆的点。

image.png

在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