STL容器系列文章:multiset容器

1. 头文件

#include 	// 与set一致

2. 定义

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

3. 对象创建

  • 与set一致
方法 说明
multiset mySet; 空集合
multiset mySet{1, 2, 3}; 定义时初始化
multiset mySet(otherSet); 用其他集合初始化,数据类型要相同
multiset mySet(++otherSet.begin(), otherSet.end()); 迭代器复制
multiset 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 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

你可能感兴趣的:(C/C++,STL,multiset,关联容器,RB,Tree)