当前位置: 首页 > news >正文

c++ set/multiset容器

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

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

引入头文件
#include <set>  
#include <iostream>
声明和初始化
// 声明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};
插入元素
s.insert(6);  
ms.insert(4);  
ms.insert(4); // 在multiset中,可以插入重复元素
查找元素
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";
遍历元素
for (const auto& elem : s) {  std::cout << elem << " ";  
}  
std::cout << '\n';  for (const auto& elem : ms) {  std::cout << elem << " ";  
}  
std::cout << '\n';
删除元素
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

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的迭代器是稳定的,这意味着在插入或删除元素时,不会使指向其他元素的迭代器失效(除了指向被删除元素的迭代器)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大数据智慧消防解决方案(24页PPT)
  • 【华为OD机试-C卷D卷-200分】二叉树的广度优先遍历(C++/Java/Python)
  • LLM中的RoPE位置编码代码解析与RoPE的性质分析(一)
  • 亲测使用frp获得访问者真实ip
  • 【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第28课-avatar玩家3D形象
  • Java学习四
  • 通付盾Web3专题 | SharkTeam:Web3常见钓鱼方式分析与安全防范建议
  • 神经网络中的归一化操作
  • 层次式架构设计理论与实践
  • kafka 案例
  • 一步步实现知乎热榜采集:Scala与Sttp库的应用
  • PostgreSQL 教程
  • 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
  • 【MySQL精通之路】InnoDB存储引擎
  • 前端开发实用工具网站(持续更新中)
  • python3.6+scrapy+mysql 爬虫实战
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [数据结构]链表的实现在PHP中
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • EOS是什么
  • ES6系统学习----从Apollo Client看解构赋值
  • JavaScript学习总结——原型
  • Linux中的硬链接与软链接
  • mac修复ab及siege安装
  • Python socket服务器端、客户端传送信息
  • scala基础语法(二)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 分布式事物理论与实践
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 诡异!React stopPropagation失灵
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 通过git安装npm私有模块
  • 通过npm或yarn自动生成vue组件
  • 阿里云服务器购买完整流程
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ######## golang各章节终篇索引 ########
  • (07)Hive——窗口函数详解
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2015)JS ES6 必知的十个 特性
  • (void) (_x == _y)的作用
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)iOS字体
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net多线程Threading相关详解
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Autowired @Resource @Qualifier的区别
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [.net]官方水晶报表的使用以演示下载
  • [20150904]exp slow.txt