STL容器系列文章:multiset容器

本文详细介绍了C++中的multiset容器,它是一个有序可重复元素的集合,底层基于红黑树实现。内容包括multiset的创建、插入、删除、查找等操作方法。同时,通过LeetCode480题的解决方案展示了multiset在滑动窗口问题中的应用,用于计算中位数。
摘要由CSDN通过智能技术生成

1. 头文件

#include <set>	// 与set一致

2. 定义

  • 有序可重复集合。与set的区别,相同元素可以重复
    multiset中元素不唯一有序。底层也是红黑树RB Tree实现,查找对数时间复杂度
  • 类模板定义:实际使用中最多使用前两个参数,一般就用参数1-数据类型,参数2-默认升序less<T>,降序排列greater<T>
template <class T,						// 存储元素类型
		  class Compare = less<T>,		// 指定容器内部的排序规则,默认升序less
		  class Alloc = allocator<T>,	// 指定分配器对象的类型
		  > class multiset;

3. 对象创建

  • 与set一致
方法说明
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的功能
  • 应用:leetcode 480题
vector<double> medianSlidingWindow(vector<int>& nums, int k) {
    // 哪种数据结构支持自动有序可重复存储->multiset和multimap,无映射关系,选择multiset
	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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值