1. 头文件
#include <set>
2. 定义
- 有序可重复集合。与set的区别,相同元素可以重复
multiset中元素不唯一,有序。底层也是红黑树RB Tree实现,查找对数时间复杂度 - 类模板定义:实际使用中最多使用前两个参数,一般就用参数1-数据类型,参数2-默认升序less<T>,降序排列greater<T>
template <class T,
class Compare = less<T>,
class Alloc = allocator<T>,
> class multiset;
3. 对象创建
方法 | 说明 |
---|
multiset<int> mySet; | 空集合 |
multiset<int> mySet{1, 2, 3}; | 定义时初始化 |
multiset<int> mySet(otherSet); | 用其他集合初始化,数据类型要相同 |
multiset<int> mySet(++otherSet.begin(), otherSet.end()); | 迭代器复制 |
multiset<int, std::greater> mySet; | 指定为降序排列 |
4. 常用方法
方法 | 说明 |
---|
mySet.size(); | 容器大小 |
mySet.max_size(); | 容器最大容量 |
mySet.empty(); | 是否为空 |
方法 | 说明 |
---|
mySet.insert(const T& ele); | 添加元素 |
mySet.insert(iterator it, const T& ele); | 某个位置(之前)插入元素 |
mySet.insert(set2.first, set2.last); | 插入另一个set中[first, last)元素 |
方法 | 说明 |
---|
mySet.erase(const T& ele); | 删除元素值等于ele的元素(多个) |
mySet.erase(iterator it); | 删除迭代器所指的元素 |
mySet.erase(iterator first, iterator last); | 删除[first, last)迭代器区间元素 |
mySet.clear(); | 清空所有元素 |
方法 | 说明 |
---|
mySet.find(element); | 查找某个元素,成功返回迭代器,识别返回end() |
mySet.count(element); | 返回值为element的元素个数,不同于set,可能大于1 |
multiset::iterator it = mySet.lower_bound(key); | 返回第一个不小于key的元素的迭代器,否则返回mySet.end() |
multiset ::iterator it = mySet.upper_bound(key); | 返回第一个大于key的元素的迭代器,否则返回mySet.end() |
pair<multiset ::iterator first, multiset::iterator last> s_pair = mySet.equal_range(key); | 相当于lower_bound和upper_bound的组合, 返回一个key取值的上下限对应的迭代器 [first, last),即所有等于key值的元素; pair.first和lower_bound()方法返回值等价,pair.second和upper_bound()方法返回值等价 |
方法 | 说明 |
---|
mySet.swap(set& anotherSet); | 交换两个容器的所有元素,容器类型必须相同 |
swap(set1, set2); | swap函数的另一种调用形式 |
方法 | 说明 |
---|
begin()/end() | 正向迭代器 |
cbegin()/cend() | const正向迭代器 |
rbegin()/rend() | 反向迭代器 |
crbegin()/crend() | const反向迭代器 |
方法 | 说明 |
---|
next(iterator it, num) | 访问当前迭代器it往后num迭代器指向的元素,num为正 |
prev(iterator it, num) | 访问当前迭代器it往前num迭代器指向的元素,num为正 |
advance(iterator it, num) | 往前往后访问均可,num可正可负,具有next和prev的功能 |
vector<double> medianSlidingWindow(vector<int>& nums, int k) {
multiset<int> mySet;
vector<double> ans;
int low = 0;
int high = 0;
for (; high < nums.size(); high++) {
mySet.insert(nums[high]);
if (mySet.size() > k) {
mySet.erase(mySet.lower_bound(nums[low]));
low++;
}
if (mySet.size() == k) {
ans.emplace_back((static_cast<double>(*next(mySet.begin(), (k - 1) / 2.0)) + static_cast<double>(*next(mySet.begin(), k / 2))) / 2.0);
}
}
return ans;
}
参考文章:
multiset对象创建和常用方法
multiset用法详解
created by shuaixio, 2021.06.19