C++(11): set与multiset

目录

1. 简述

2. std::set

3. API

(1)元素插入

(2)元素删除

(3)特定元素查找

(4)清空元素

(5)元素个数

(6)set能够容纳的最大元素数

(7)判空

(8)迭代

(9)set内容交换

(10)比较操作

4. 例程

5. multiset

6. multiset例程


1. 简述

        在C++标准模板库(STL)中,std::set是一个基于平衡二叉搜索树(通常是红黑树)的关联容器,它能够存储唯一的元素并保持这些元素按排序顺序。由于std::set内部通常使用红黑树(一种自平衡的二叉搜索树)来实现,所以保证高效的查找、插入和删除操作。

2. std::set

        std::set的原型如下。

template < class T, class Compare = less<T>, class Allocator = allocator<T> >  

class set;

其中:

        T 是存储在集合中的元素的类型。

        Compare 是一个二元谓词,用于比较两个元素。默认是 std::less<T>,即按照升序排序。

        Allocator 是用于管理存储的分配器对象。默认是 std::allocator。

        std::set的构造函数如下。

 set(); ///< 默认构造函数

set(const set& other); ///< 拷贝构造函数

set(set&& other); ///< 移动构造函数

set(std::initializer_list<value_type> init); ///< 使用初始化列表构造

explicit set(const Compare& comp); // 指定比较函数的构造函数

set(const Compare& comp, const Allocator& alloc); ///< 指定比较函数和分配器的构造函数 

3. API

        std::set提供了丰富的成员函数来操作集合,以下是一些常用的API函数:

(1)元素插入

        pair<iterator, bool> insert(const value_type& val):

        向集合中插入一个新的元素。

        iterator insert(const_iterator hint, const value_type& val):

        在 hint 提供的位置附近插入 val,提高插入效率。

(2)元素删除

        erase(value_type val):从集合中删除一个元素。

(3)特定元素查找

        const_iterator find(const key_type& key):查找与 key 相匹配的元素,返回一个迭代器指向找到的元素或 end() 如果未找到。

        const_reference at(size_type pos):访问指定位置 pos 的元素,如果 pos 超出范围,抛出 std::out_of_range。

(4)清空元素

        void clear():清空集合中的所有元素。

(5)元素个数

        size_type size() const:返回集合中元素的数量。

(6)set能够容纳的最大元素数

        size_type max_size() const;

(7)判空

        bool empty() const:检查集合是否为空。

(8)迭代

        iterator begin():返回指向 set 开始的迭代器。

        const_iterator begin() const:返回指向 set 开始的常量迭代器。

        iterator end():返回指向 set 结束的迭代器(尾后一个位置)。

        const_iterator end() const:返回指向 set 结束的常量迭代器。

(9)set内容交换

        void swap(set& other):与 other 交换内容。

(10)比较操作

        bool operator==(const set& other) const:判断当前 set 是否与 other 相等。

        bool operator!=(const set& other) const:判断当前 set 是否与 other 不相等。

        bool operator<(const set& other) const:判断当前 set 是否小于 other。

        bool operator<=(const set& other) const:判断当前 set 是否小于等于 other。

        bool operator>(const set& other) const:判断当前 set 是否大于 other。

        bool operator>=(const set& other) const:判断当前 set 是否大于等于 other。

4. 例程

#include <iostream>  #include <set>  int main(int argc, char* argv[]){  /** 创建一个存储整数的set容器 */  std::set<int> mySet;  /** 向set中插入元素 */  mySet.insert(5);  mySet.insert(3);  mySet.insert(9);  mySet.insert(1);  mySet.insert(7);  mySet.insert(3); ///< 尝试插入重复元素,将不会成功  /** 输出set中的元素 */for (int num : mySet) {  std::cout << num << " ";  }  std::cout << std::endl; ///< 输出:1 3 5 7 9 (已排序,且无重复)  /** 查找元素 */if (mySet.find(7) != mySet.end()) {  std::cout << "Element 7 found in the set." << std::endl;  } else {  std::cout << "Element 7 not found in the set." << std::endl;  }  /** 删除元素 */ mySet.erase(5);  std::cout << "After erasing 5, the set contains:" << std::endl;  for (int num : mySet) {  std::cout << num << " ";  } ///< 输出:1 3 7 9 (5已被删除)  return 0;  }

5. multiset

        multiset与set类似,都是基于红黑树的结构,不同的是,multiset允许存储多个值相同的元素。

        其原型如下。

template< class Key, class Compare = std::less<Key>, class Allocator = std::allocator<Key> >  

class multiset;

        multiset提供了丰富的成员函数来进行元素的插入、删除、查找等操作。例如:

        插入元素:使用insert()函数可以插入一个或多个元素到multiset中。

        删除元素:使用erase()函数可以删除指定元素或指定范围内的元素。

        查找元素:使用find()函数可以查找指定元素,并返回指向该元素的迭代器。此外,还可以使用lower_bound()和upper_bound()函数来查找等值区间的起始和结束位置。

        遍历元素:可以使用迭代器来遍历multiset中的所有元素。

6. multiset例程

#include <iostream>  #include <set>  int main(int argc, char* argv[]){  /** 创建一个multiset容器 */  std::multiset<int> myMultiset;  /** 插入元素,包括重复值  */ myMultiset.insert(30);  myMultiset.insert(20);  myMultiset.insert(30); ///< 插入重复值  myMultiset.insert(10);  myMultiset.insert(30); ///< 再次插入重复值  myMultiset.insert(40);  /** 查找值为30的元素  */ auto itFind = myMultiset.find(30);  if (itFind != myMultiset.end()) {  std::cout << "Found " << *itFind << " in the multiset." << std::endl;  }  /** 使用lower_bound和upper_bound遍历所有值为30的元素  */ auto itLower = myMultiset.lower_bound(30);  auto itUpper = myMultiset.upper_bound(30);  std::cout << "All elements with value 30 in the multiset:" << std::endl;  for (auto it = itLower; it != itUpper; ++it) {  std::cout << *it << " ";  }  std::cout << std::endl;  /** 输出multiset中的所有元素 */  std::cout << "All elements in the multiset:" << std::endl;  for (const auto& elem : myMultiset) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中ignore用法的深度解析

Python中ignore用法的深度解析 在Python编程中&#xff0c;ignore这个词汇常常与多种功能关联&#xff0c;包括但不限于异常处理、文件读写时的忽略特定字符或行&#xff0c;以及正则表达式中的忽略大小写等。本文将深入剖析Python中ignore的各种用法&#xff0c;旨在帮助读者…

【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同

&#x1f448;️上一篇:享元模式 回 顾&#xff1a;结构型设计模式 1.代理模式&#x1f448;️ 2.装饰器模式&#x1f448;️ 3.适配器模式&#x1f448;️ 4.组合模式&#x1f448;️ 5.桥接模式&#x1f448;️ 6.外观模式&#x1f448;️ 7.享元模式&#x…

jmeter性能测试用例提取

性能测试用例提取参考(根据单、混合场景、模块、运行时间、优先级)去考虑 Tips&#xff1a;用例提取和用例设计不一样 后期可以结合性能测试用例设计(设置线程数、时间、循环、同步定时器等等&#xff09;来做性能测试

Python 字符串的修剪、拆分与合并

一、字符串的修剪 在Python中&#xff0c;字符串的修剪&#xff08;去除字符串两端的空格或特定字符&#xff09;可以通过以下方法实现&#xff1a; 1、strip(): strip() 方法用于去除字符串两端的空格或指定字符&#xff08;默认为空格&#xff09;。例&#xff1a; s &qu…

使用Go和Node.js构建用静态脚本进行数据解析的TCP服务器

在本文中&#xff0c;我们将介绍如何使用Go编程语言构建一个TCP服务器&#xff0c;该服务器接收客户端发送的数据&#xff0c;使用Node.js脚本处理数据&#xff0c;然后将处理后的数据返回给客户端。 程序概述 该程序包含以下主要部分: processWithJS函数&#xff0c;用于调…

浏览器/html页面渲染过程

html 页面渲染过程: 1. 浏览器获取到 html 资源后开始解析 html ( dom tree ) --> 构建 dom 树 2. 解析到 css 后根据 css 生成 css 规则树 ( style rules )--> 产生 css 规则树 3. dom 和 css 规则树生成完成 4. 通过 dom 树和 css 规则树生成渲染树 ( render t…

K210视觉识别模块学习笔记4: 训练与使用自己的模型_识别字母

今日开始学习K210视觉识别模块: 模型训练与使用_识别字母 亚博智能的K210视觉识别模块...... 固件库: maixpy_v0.6.2_52_gb1a1c5c5d_minimum_with_ide_support.bin 文章提供测试代码讲解、完整代码贴出、测试效果图、测试工程下载 这里也算是正式开始进入到视觉识别的领域了…

动态库(DLL)和静态库(LIB)的区别

链接时间&#xff1a; 静态库&#xff08;LIB&#xff09;在编译链接时整合到程序中。动态库&#xff08;DLL&#xff09;在程序运行时动态加载。 内存共享&#xff1a; 静态库导致每个程序副本都包含库代码。动态库允许多个程序共享同一份代码。 更新维护&#xff1a; DLL更新…

通信网优:薪资从3k-20k究竟要多久?

随着华为中标结果的不断公布&#xff0c;通信网优行业有了新变化。各大通信公司关于今年的网优业务市场份额也陆续公布&#xff0c;从目前的中标结果来看 杭州东信网络技术有限公司和南京嘉环科技股份有限公司并列排名第一&#xff0c;信科通信科技有限公司排名第三。而北京电旗…

ABP框架+Mysql(三)

创建,更新和删除图书 创建新书籍 创建 modal form 在 Acme.BookStore.Web 项目的 Pages/Books 目录下新建一个 CreateModal.cshtml Razor页面: CreateModal.cshtml.cs 打开 CreateModal.cshtml.cs 代码文件(CreateModalModel 类),替换成以下代码: using System.Threading.…

使用多种云进行OSS存储,详细教程

文章目录 这边文章是交大家进行多种云的存储,市场上主流的云存储,腾讯云,华为云,由于阿里云腾讯云 这边文章是交大家进行多种云的存储,市场上主流的云存储,腾讯云,华为云,由于 阿里云 阿里云本人以及出了详细的教程,这里就不讲解了,可以直接查看链接 阿里云实现思路: link 腾…

Html大前端与前端的区别:深度解析与实用指南

Html大前端与前端的区别&#xff1a;深度解析与实用指南 在谈论Html大前端与前端之间的区别时&#xff0c;我们首先需要理解这两者各自的定义和涵盖的范围。在软件开发的广阔领域中&#xff0c;前端与Html大前端各自扮演着不同的角色&#xff0c;并且随着技术的不断演进&#…

C/C++|回调函数的正确打开方式

最近在学习muduo库&#xff0c;其中的回调给我弄得晕头转向&#xff0c;后来才发现主要是回调函数的使用逻辑还没摸清楚&#xff0c;所以这里用一个简单的案例&#xff0c;来探究他们都是如何使用回调函数的。 一般回调函数都是用在类中&#xff1a; 我们将创建一个 EventHan…

【贪心算法题目练习】

1. 分发饼干 这道题目和我们之前讲到的田忌赛马的问题很相似&#xff0c;只不过这这里不需要劣等马去抵消掉优等马&#xff0c;直接上贪心策略&#xff1a; 先将两个数组排序。针对胃口较小的孩子&#xff0c;从小到大挑选饼干: i. 如果当前饼干能满足&#xff0c;直接喂(最小…

Windows安装Linux子系统WSL

Windows安装Linux子系统WSL 一、相比直接安装虚拟机优缺点:1、优点:2、缺点:二、开启WSL服务1、开启开发人员模式2、点开你电脑的设置然后点击应用3、安装过程4.启动5.那么共享文件在哪里呢?注意三、集成VScode开发环境1、新建终端2、选择WSL一、相比直接安装虚拟机优缺点:…

Flutter开发效率提升1000%,Flutter Quick教程之对组件进行拖拽与接收

1&#xff0c;首先&#xff0c;所有可以选择的组件&#xff0c;都在左边的组件面板里。从里面点击任何一个&#xff0c;按住左键&#xff0c;向右边的手机面板上进行拖拽即可。 2&#xff0c;拖拽后&#xff0c;我们要选择一个接收组件。什么时候可以接收组件&#xff0c;就是当…

Go 内存分配机制

是什么&#xff1f; Go语言内置运行的runtime&#xff0c;抛弃传统的内存分配方式&#xff0c;比如内存池&#xff0c;预分配等&#xff0c;这样不会每次内存分配都给系统调用。 为什么&#xff1f; golang的内存分配机制将程序员从手动管理内存的繁琐任务脱离出来。 怎么用…

反转字符串中的单词-力扣

此题将问题分为三步进行解决&#xff1a; 第一步&#xff0c;删除字符串中多余的空格&#xff0c;removeSpaces函数中删除所有的空格&#xff0c;并手动在每个单词后添加一个空格&#xff0c;最后重构字符串s第二步&#xff0c;将整个字符串反转第三步&#xff0c;对反转后的字…

代码随想录训练营Day57(单调栈解决最近大于或小于关系):Leetcode739、496、面试经典百题:Leetcode80、274

Leetcode739&#xff1a; 问题描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请…

龙叔Linux:别名(alias)

在Linux中&#xff0c;别名&#xff08;alias&#xff09;是一个命令的简短形式&#xff0c;通常用于简化或替换更长的命令序列。你可以使用alias命令来创建、查看和删除别名&#xff0c;定制自己专属的命令。一、创建别名 1.1、临时创建 你可以使用alias命令在命令行中直接定…