c++ 11标准模板(STL) std::set(三)
定义于头文件 <set>
template< class Key, | (1) | |
namespace pmr { template <class Key, class Compare = std::less<Key>> | (2) | (C++17 起) |
std::set
是关联容器,含有 Key
类型对象的已排序集。用比较函数 比较 (Compare) 进行排序。搜索、移除和插入拥有对数复杂度。 set
通常以红黑树实现。
在每个标准库使用比较 (Compare) 概念的场所,用等价关系确定唯一性。不精确地说,若二个对象 a
与 b
相互间既不比较大于亦不比较小于: !comp(a, b) && !comp(b, a)
,则认为它们等价。
std::set
满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、关联容器 (AssociativeContainer) 和可逆容器 (ReversibleContainer) 的要求。
成员函数
赋值给容器
std::set<Key,Compare,Allocator>::operator=
set& operator=( const set& other ); | (1) | |
set& operator=( set&& other ); | (2) | (C++11 起) (C++17 前) |
set& operator=( set&& other ) noexcept(/* see below */); | (C++17 起) | |
set& operator=( std::initializer_list<value_type> ilist ); | (3) | (C++11 起) |
替换容器内容。
1) 复制赋值运算符。以 other
的副本替换内容。若 std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value 为 true ,则以源分配器的副本替换目标分配器。若源分配器与目标分配器不比较相等,则用目标( *this )分配器销毁内存,然后在复制元素前用 other
的分配器分配。 (C++11 起).、
2) 移动赋值运算符。用移动语义以 other
的内容替换内容(即从 other
移动 other
中的数据到此容器)。之后 other
在合法但未指定的状态。若 std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value 为 true ,则用源分配器的副本替换目标分配器。若它为 false 且源与目标分配器不比较相等,则目标不能取走源内存的所有权,而必须单独移动赋值逐个元素,用自己的分配器按需分配额外的内存。任何情况下,原先在 *this 中的元素要么被销毁,要么以逐元素移动赋值替换。
3) 以 initializer_list ilist
所标识者替换内容。
参数
other | - | 用作数据源的另一容器 |
ilist | - | 用作数据源的 initializer_list |
返回值
*this
复杂度
1) 与 *this
和 other
的大小成线性。
2) 与 *this
的大小成线性,除非分配器不比较相等且不传播,该情况下与 *this
和 other
的大小成线性。
3) 通常为 O(NlogN) ,其中 N 为 size() + ilist.size() 。若 ilist 相对于 value_comp() 已排序则为线性。
异常2)noexcept 规定:noexcept(std::allocator_traits<Allocator>::is_always_equal::value | (C++17 起) |
注意
容器移动赋值(重载 (2) )后,除非不兼容的分配器强制逐元素赋值,否则指向 other
的引用、指针和迭代器(除了尾迭代器)都保持合法,不过指代的元素现在在 *this 中。当前标准通过 §23.2.1[container.requirements.general]/12 中的总括陈述保证这点,而 LWG 2321 下正在考虑更直接的保证。
返回相关的分配器
std::set<Key,Compare,Allocator>::get_allocator
allocator_type get_allocator() const; |
返回与容器关联的分配器。
参数
(无)
返回值
关联的分配器。
复杂度
常数。
调用示例
#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <time.h>
#include <set>using namespace std;struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator +(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator *(const Cell &cell){x *= cell.x;y *= cell.y;return *this;}Cell &operator ++(){x += 1;y += 1;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator >(const Cell &cell) const{if (x == cell.x){return y > cell.y;}else{return x > cell.x;}}bool operator ==(const Cell &cell) const{return x == cell.x && y == cell.y;}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}int main()
{auto generate = [](){int n = std::rand() % 10 + 100;Cell cell{n, n};return cell;};std::set<Cell> set1{generate(), generate(), generate(), generate(), generate()};std::cout << "set1: ";std::copy(set1.begin(), set1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//1) 复制赋值运算符。以 other 的副本替换内容。std::set<Cell> set2 = set1;std::cout << "set2: ";std::copy(set2.begin(), set2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//2) 移动赋值运算符。用移动语义以 other 的内容替换内容(即从 other 移动 other 中的数据到此容器)。std::set<Cell> set3 = std::move(set1);std::cout << "set1 is empty: " << set1.empty() << std::endl;std::cout << "set3: ";std::copy(set3.begin(), set3.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//3) 以 initializer_list ilist 所标识者替换内容。std::set<Cell> set4 = {generate(), generate(), generate(), generate(), generate()};std::cout << "set4: ";std::copy(set4.begin(), set4.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;return 0;
}
输出
相关文章:

c++ 11标准模板(STL) std::set(三)
定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…...
ChatGPT详细介绍
ChatGPT: 自然语言处理的强大工具 ChatGPT是一种基于人工智能的自然语言处理模型,它是由OpenAI开发的一款先进的语言模型。ChatGPT基于GPT-3.5架构,具有强大的语言生成和理解能力。它被设计用于与人类进行自然对话,并提供广泛的应用场景。 …...
【算法】【算法杂谈】让[0,x)区间上的出现概率变为x^k
目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介…...
【2023华为OD笔试必会25题--C语言版】《21 对称美学》——字符串、递归
本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 随着无线传感器网络(Wireless Sensor Network,WSN)的广泛应用,业界开始应用环境能量收集技术解决传感器节点的能量补充问题。而…...

springboot+vue滴答拍摄影项目(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的滴答拍摄影项目。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌…...
SQL基础培训13-索引和优化
进度13-索引和优化-SQL基础培训 知识点: 你可以把索引理解为一种特殊的目录。索引分聚集索引(clustered index,也称聚类索引、簇集索引) 和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。 1、聚集索引 以汉语字典举例,汉语字典有部首目录和检字表,还…...
拥抱5G发展机遇,从边缘计算上车
随着5G技术的逐渐普及和应用,边缘计算成为了当前信息技术领域的热门话题。边缘计算是指将计算和数据存储移动到网络的边缘,即源站以外的网络设备。与云计算相比,边缘计算更加贴近数据生成和处理的实时应用场景,具有更高的性能和更…...

“前端”工匠系列(二):合格的工匠,怎么做好价值落地 | 京东云技术团队
一、“技术鄙视链?” 如果你是一个技术人,相信都知道技术圈有个相互的鄙视链,这个链条从技术人自己认知的角度在以业务价值为中心嵌套的一层一层的环,就像洋葱,具体的描述这里不赘述了。 出门左拐随便抓住一个人问一…...

Oracle11g下载与安装
一、Oracle11g下载 官网下载地址:Oracle Database 11g Release 2 for Microsoft Windows (x64) 选择"Accept License Agreement",点击"win64_11gR2_database_1of2.zip"和"win64_11gR2_database_2of2.zip",进行…...
考研复试-软件工程
什么是软件工程?主要的方法?软件工程三要素?软件的生命周期?组成部分?软件过程的定义软件需求分析的任务软件开发过程的常见模型结构化设计方法,结构化分析方法软件测试的目的?分类?…...
软件测试选择题
下列选项中,哪一项不是软件开发模型(A) A、V模型 B、快速模型 C、螺旋模型 D、敏捷模型 下列选项中,哪一项不是影响软件质量的因素(C) A、需求模糊 B、缺乏规范的文档指导 C、使用新技术 D、开发人…...

有限合伙企业与有限公司的区别
1、设立要求不同: 有限合伙企业:根据《合伙企业法》设立,第61条规定必须由2个(包含2个)以上的合伙人出资设立,有限合伙企业合伙人中至少有一名是普通合伙人。有限责任公司:根据《公司法》设立&…...
从洛克菲勒思想中洞悉的财富秘密
超友们,早上好~ 🙆 今天我为你带来的分享是《从洛克菲勒思想中洞悉的财富秘密》,主要分为两个部分: 一、【洛克菲勒的 10 大底层心法】 二、【洛克菲勒工作的 6 大原则】 如何从贫穷通往富裕? 「始终把这…...

如何训练自己的大型语言模型
如何使用 Databricks、Hugging Face 和 MosaicML 训练大型语言模型 (LLM) 介绍 大型语言模型,如 OpenAI 的 GPT-4 或谷歌的 PaLM,已经席卷了人工智能世界。然而,大多数公司目前没有能力训练这些模型,并且完全依赖少数大型科技公司…...
Java中的SLF4J是什么?如何使用SLF4J进行日志管理
在Java开发中,日志管理是一个非常重要的问题。日志管理可以帮助开发人员更好地了解应用程序的运行情况,以及快速诊断和解决问题。而SLF4J是Java中最常用的日志管理框架之一。在本文中,我们将详细介绍SLF4J的概念和使用方法。 什么是SLF4J&am…...
PHP程序员面对的压力大不大?我来聊聊程序员转行的就业方向
作为一名程序员,不同领域、不同公司和不同项目所面对的压力程度可能会有所不同。但是,一般来说,程序员需要长时间专注于编写代码,需要不断学习和适应新的技术和变化,还需要在项目的压力下保证工作的质量和进度。因此&a…...
牛客网专项练习Pytnon分析库(十)
1.Python Pandas处理缺失值,以下哪个选项是对缺失值NaN进行删除操作(C)。 A.isnull B.notnull C.dropna D.fillna 解析: A选项,Isnull()返回表明哪些值是缺失值的布尔值; B选项,notnull()返…...

leecode654——最大二叉树
leecode最大二叉树 🌻题目要求: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的…...

【笔试强训选择题】Day12.习题(错题)解析
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…...
解决transformers.adapters import AdapterConfig 报错的问题
需要安装 Adapter-Hub 的 transformers 分支,不是官方 transformers 库! pip install githttps://github.com/Adapter-Hub/transformers.git✅ 注意:这个命令会从 GitHub 下载源码并安装。你需要确保你的网络可以访问 GitHub,并且…...

ESP12E/F 参数对比
模式GPIO0GPIO2GPIO15描述正常启动高高低从闪存运行固件闪光模式低高低启用固件刷写 PinNameFunction1RSTReset (Active Low)2ADC (A0)Analog Input (0–1V)3EN (CH_PD)Chip Enable (Pull High for Normal Operation)4GPIO16Wake from Deep Sleep, General Purpose I/O5GPIO14S…...
《视觉SLAM十四讲》自用笔记 第三讲:三维空间刚体运动
第三讲 三维空间刚体运动 3.0 目标 1.理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。 2.掌握 Eigen 库的矩阵、几何模块使用方法。 3.1 旋转矩阵 3.1.1 点和向量,坐标系 三维空间中,刚体的运动可以用两个概念来…...

基于PostGIS的各地级市路网长度统计及Echarts图表可视化实践-以湖南省为例
目录 前言 一、路网长度计算 1、地级市列表查询 2、地级市路网长度查询 二、Echarts可视化实现 1、Echarts后端生成 2、引入Colormap配色 3、前端微调 三、总结 前言 在当今快速发展的社会中,交通路网的建设与布局对于一个地区的经济发展、居民生活以及城市…...
go的工具库:github.com/expr-lang/expr
github.com/expr-lang/expr 是一个 Go 语言的表达式求值库,它允许你在运行时安全地执行表达式。主要用途包括: 1.表达式求值: program, err : expr.Compile("2 2") if err ! nil {// 处理错误 } result, err : expr.Run(program…...

【razor】x264 在 的intra-refresh和IDR插帧
你提到的是这样一个情况: 使用 DirectShow 采集,帧率稳定(如回调了20帧)使用 x264 的 total intra refresh 模式(intra-refresh=1) 进行编码但编码过程中「隔几十秒才有一帧intra(关键帧)」这不正常,具体分析如下: 🎯 一、问题核心 x264 的 intra refresh 模式(特…...

STM32什么是寄存器
提示:文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问: 1、什么是寄存器? 答:在4GB的地址空间中,512MB的block2上,每4个字节组成32位,这个32位为一个单元,控制&a…...
Android第十二次面试-多线程和字符串算法总结
多线程的创建与常见使用方法 一、多线程创建方式 1. 继承Thread类 class MyThread extends Thread {Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() " is running");} }// 使用 MyThread thread new …...

设计模式基础概念(行为模式):模板方法模式 (Template Method)
概述 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 是基于继承的代码复用的基本技术,模板方法模式的类结构图中,只有继承关系。 需要开发抽象类和具体子…...
使用 Unstructured 开源库快速入门指南
引言 本文将介绍如何使用 Unstructured 开源库(GitHub,PyPI)和 Python,在本地开发环境中将 PDF 文件拆分为标准的 Unstructured 文档元素和元数据。这些元素和元数据可用于 RAG(检索增强生成)应用、AI 代理…...