c++ set/multiset容器

在C++标准库中,setmultiset 是两种非常有用的关联容器,它们包含唯一元素(对于set)或可重复元素(对于multiset),并且默认情况下这些元素都是自动排序的。它们通过键(即存储的元素本身)来存储和检索元素,因此这些容器中的元素都是唯一的(对于set)或者可以有重复的(对于multiset)。

以下是setmultiset的一些基本用法:

引入头文件
cpp 复制代码
#include <set>  
#include <iostream>
声明和初始化
cpp 复制代码
// 声明set,自动对int类型元素排序  
std::set<int> s;  
  
// 声明multiset,允许int类型元素重复  
std::multiset<int> ms;  
  
// 初始化  
std::set<int> s = {1, 2, 3, 4, 5};  
std::multiset<int> ms = {1, 2, 2, 3, 3, 3};
插入元素
cpp 复制代码
s.insert(6);  
ms.insert(4);  
ms.insert(4); // 在multiset中,可以插入重复元素
查找元素
cpp 复制代码
if (s.find(3) != s.end()) {  
    std::cout << "3 is in the set.\n";  
}  
  
// 对于multiset,可以使用count方法来查找元素的数量  
size_t count_of_3 = ms.count(3);  
std::cout << "There are " << count_of_3 << " 3s in the multiset.\n";
遍历元素
cpp 复制代码
for (const auto& elem : s) {  
    std::cout << elem << " ";  
}  
std::cout << '\n';  
  
for (const auto& elem : ms) {  
    std::cout << elem << " ";  
}  
std::cout << '\n';
删除元素
cpp 复制代码
s.erase(3); // 删除set中的元素3(如果存在)  
ms.erase(4); // 删除multiset中所有值为4的元素  
  
// 也可以通过迭代器删除元素  
auto it = ms.find(2);  
if (it != ms.end()) {  
    ms.erase(it); // 删除迭代器指向的元素  
}
其他操作
  • size():返回容器中元素的数量。
  • empty():如果容器为空,则返回true
  • clear():删除容器中的所有元素。
  • lower_bound(key)upper_bound(key):返回指向不小于(大于)给定键的第一个元素的迭代器。这两个函数对于实现范围查找特别有用。
  • 这里详细声明 lower_bound(key) 和 upper_bound(key)
lower_bound(key)

lower_bound(key)函数返回一个迭代器,指向第一个不小于(即大于或等于)key的元素。如果key不在容器中,则返回指向容器中第一个大于key的位置的迭代器,如果容器中没有任何元素大于key,则返回end()迭代器

upper_bound(key)

upper_bound(key)函数返回一个迭代器,指向第一个大于key的元素。如果key不在容器中,或者key是容器中的最后一个元素,则返回end()迭代器。

示例:

假设我们有一个multiset<int>容器ms,包含以下元素:1 2 2 3 4 4 4 5

cpp 复制代码
std::multiset<int> ms = {1, 2, 2, 3, 4, 4, 4, 5};  
  
auto lb = ms.lower_bound(3); // lb指向第一个不小于3的元素,即3  
auto ub = ms.upper_bound(3); // ub指向第一个大于3的元素,即4  
  
// 遍历[lb, ub)范围内的元素  
for (auto it = lb; it != ub; ++it) {  
    std::cout << *it << ' '; // 输出:3  
}  
  
lb = ms.lower_bound(4); // lb指向第一个不小于4的元素,即4  
ub = ms.upper_bound(4); // ub指向第一个大于4的元素,即5  
  
// 遍历[lb, ub)范围内的元素  
for (auto it = lb; it != ub; ++it) {  
    std::cout << *it << ' '; // 输出:4 4 4  
}
  • 这两个函数通常用于在有序容器中实现范围查找,特别适用于需要查找一个键的多个相同值的情况(如在multiset中)。
  • 由于setmultiset是自动排序的,所以这些操作的时间复杂度都是对数级别的。

请注意,setmultiset的迭代器是稳定的,这意味着在插入或删除元素时,不会使指向其他元素的迭代器失效(除了指向被删除元素的迭代器)。

相关推荐
鹿鹿学长11 分钟前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
zhousenshan19 分钟前
Python爬虫常用框架
开发语言·爬虫·python
利刃大大1 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
DKPT1 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
C语言小火车2 小时前
【C++八股文】基础知识篇
c++·tcp/ip·const·智能指针·多线程同步·static关键字·c++内存模型
liulilittle2 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
眠りたいです2 小时前
基于脚手架微服务的视频点播系统-播放控制部分
c++·qt·ui·微服务·云原生·架构·播放器
耶啵奶膘2 小时前
uni-app头像叠加显示
开发语言·javascript·uni-app
看海天一色听风起雨落2 小时前
Python学习之装饰器
开发语言·python·学习
Want5952 小时前
C/C++圣诞树①
c语言·开发语言·c++