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

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 set = std::set<Key, Compare, std::pmr::polymorphic_allocator<Key>>;

}
(2)(C++17 起)

std::set 是关联容器,含有 Key 类型对象的已排序集。用比较函数 比较 (Compare) 进行排序。搜索、移除和插入拥有对数复杂度。 set 通常以红黑树实现。

在每个标准库使用比较 (Compare) 概念的场所,用等价关系确定唯一性。不精确地说,若二个对象 ab 相互间既不比较大于亦不比较小于: !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) 与 *thisother 的大小成线性。

2) 与 *this 的大小成线性,除非分配器不比较相等且不传播,该情况下与 *thisother 的大小成线性。

3) 通常为 O(NlogN) ,其中 N 为 size() + ilist.size() 。若 ilist 相对于 value_comp() 已排序则为线性。

异常

2)noexcept 规定:  

noexcept(std::allocator_traits<Allocator>::is_always_equal::value
&& std::is_nothrow_move_assignable<Compare>::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是一种基于人工智能的自然语言处理模型&#xff0c;它是由OpenAI开发的一款先进的语言模型。ChatGPT基于GPT-3.5架构&#xff0c;具有强大的语言生成和理解能力。它被设计用于与人类进行自然对话&#xff0c;并提供广泛的应用场景。 …...

【算法】【算法杂谈】让[0,x)区间上的出现概率变为x^k

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…...

【2023华为OD笔试必会25题--C语言版】《21 对称美学》——字符串、递归

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着无线传感器网络(Wireless Sensor Network,WSN)的广泛应用,业界开始应用环境能量收集技术解决传感器节点的能量补充问题。而…...

springboot+vue滴答拍摄影项目(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的滴答拍摄影项目。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…...

SQL基础培训13-索引和优化

进度13-索引和优化-SQL基础培训 知识点: 你可以把索引理解为一种特殊的目录。索引分聚集索引(clustered index,也称聚类索引、簇集索引) 和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。 1、聚集索引 以汉语字典举例,汉语字典有部首目录和检字表,还…...

拥抱5G发展机遇,从边缘计算上车

随着5G技术的逐渐普及和应用&#xff0c;边缘计算成为了当前信息技术领域的热门话题。边缘计算是指将计算和数据存储移动到网络的边缘&#xff0c;即源站以外的网络设备。与云计算相比&#xff0c;边缘计算更加贴近数据生成和处理的实时应用场景&#xff0c;具有更高的性能和更…...

“前端”工匠系列(二):合格的工匠,怎么做好价值落地 | 京东云技术团队

一、“技术鄙视链&#xff1f;” 如果你是一个技术人&#xff0c;相信都知道技术圈有个相互的鄙视链&#xff0c;这个链条从技术人自己认知的角度在以业务价值为中心嵌套的一层一层的环&#xff0c;就像洋葱&#xff0c;具体的描述这里不赘述了。 出门左拐随便抓住一个人问一…...

Oracle11g下载与安装

一、Oracle11g下载 官网下载地址&#xff1a;Oracle Database 11g Release 2 for Microsoft Windows (x64) 选择"Accept License Agreement"&#xff0c;点击"win64_11gR2_database_1of2.zip"和"win64_11gR2_database_2of2.zip"&#xff0c;进行…...

考研复试-软件工程

什么是软件工程&#xff1f;主要的方法&#xff1f;软件工程三要素&#xff1f;软件的生命周期&#xff1f;组成部分&#xff1f;软件过程的定义软件需求分析的任务软件开发过程的常见模型结构化设计方法&#xff0c;结构化分析方法软件测试的目的&#xff1f;分类&#xff1f;…...

软件测试选择题

下列选项中&#xff0c;哪一项不是软件开发模型&#xff08;A&#xff09; A、V模型 B、快速模型 C、螺旋模型 D、敏捷模型 下列选项中&#xff0c;哪一项不是影响软件质量的因素&#xff08;C&#xff09; A、需求模糊 B、缺乏规范的文档指导 C、使用新技术 D、开发人…...

有限合伙企业与有限公司的区别

1、设立要求不同&#xff1a; 有限合伙企业&#xff1a;根据《合伙企业法》设立&#xff0c;第61条规定必须由2个&#xff08;包含2个&#xff09;以上的合伙人出资设立&#xff0c;有限合伙企业合伙人中至少有一名是普通合伙人。有限责任公司&#xff1a;根据《公司法》设立&…...

从洛克菲勒思想中洞悉的财富秘密

超友们&#xff0c;早上好&#xff5e; &#x1f646; 今天我为你带来的分享是《从洛克菲勒思想中洞悉的财富秘密》&#xff0c;主要分为两个部分&#xff1a; 一、【洛克菲勒的 10 大底层心法】 二、【洛克菲勒工作的 6 大原则】 如何从贫穷通往富裕&#xff1f; 「始终把这…...

如何训练自己的大型语言模型

如何使用 Databricks、Hugging Face 和 MosaicML 训练大型语言模型 (LLM) 介绍 大型语言模型&#xff0c;如 OpenAI 的 GPT-4 或谷歌的 PaLM&#xff0c;已经席卷了人工智能世界。然而&#xff0c;大多数公司目前没有能力训练这些模型&#xff0c;并且完全依赖少数大型科技公司…...

Java中的SLF4J是什么?如何使用SLF4J进行日志管理

在Java开发中&#xff0c;日志管理是一个非常重要的问题。日志管理可以帮助开发人员更好地了解应用程序的运行情况&#xff0c;以及快速诊断和解决问题。而SLF4J是Java中最常用的日志管理框架之一。在本文中&#xff0c;我们将详细介绍SLF4J的概念和使用方法。 什么是SLF4J&am…...

PHP程序员面对的压力大不大?我来聊聊程序员转行的就业方向

作为一名程序员&#xff0c;不同领域、不同公司和不同项目所面对的压力程度可能会有所不同。但是&#xff0c;一般来说&#xff0c;程序员需要长时间专注于编写代码&#xff0c;需要不断学习和适应新的技术和变化&#xff0c;还需要在项目的压力下保证工作的质量和进度。因此&a…...

牛客网专项练习Pytnon分析库(十)

1.Python Pandas处理缺失值&#xff0c;以下哪个选项是对缺失值NaN进行删除操作&#xff08;C&#xff09;。 A.isnull B.notnull C.dropna D.fillna 解析&#xff1a; A选项&#xff0c;Isnull()返回表明哪些值是缺失值的布尔值&#xff1b; B选项&#xff0c;notnull()返…...

leecode654——最大二叉树

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

【笔试强训选择题】Day12.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…...

告别IPM:用BEVFormer和Deformable Attention搞定自动驾驶的‘上帝视角’(保姆级原理解析)

告别IPM&#xff1a;用BEVFormer和Deformable Attention重构自动驾驶感知范式 当特斯拉在2022年AI Day展示其纯视觉BEV&#xff08;Birds Eye View&#xff09;感知系统时&#xff0c;整个行业都意识到传统IPM方法的时代即将终结。想象一下这样的场景&#xff1a;一辆自动驾驶汽…...

张量与向量基础:AI 计算的数学本质

文章目录前言一、先搞懂&#xff1a;AI里天天说的向量&#xff0c;到底是个啥&#xff1f;1.1 别被数学定义吓住&#xff0c;向量就是"有序数字列表"1.2 用生活例子秒懂&#xff1a;向量就是"事物的数字化画像"1.3 向量的核心作用&#xff1a;让计算机能&q…...

spring boot社区养老保障系统小程序(文档+源码)_kaic

第五章 系统实现 5.1老人家属前台功能模块&#xff08;前端&#xff09; 社区养老保险系统小程序登录界面&#xff0c;通过填写账号、密码等信息进行登录&#xff0c;如图5-1所示。 图5-1登录界面图 注册&#xff0c;通过填写账号、密码、昵称、手机、邮箱、身份等信息&…...

CRLB求解中的Fisher信息阵:5个关键性质与推导技巧

CRLB求解中的Fisher信息阵&#xff1a;5个关键性质与推导技巧 在统计信号处理领域&#xff0c;Cramr-Rao下界&#xff08;CRLB&#xff09;是评估参数估计器性能的黄金标准。而Fisher信息矩阵作为CRLB的核心组成部分&#xff0c;其推导过程往往涉及复杂的矩阵运算和概率论知识。…...

打开 Word 提示环境变量错误怎么办?一文讲清注册表修复方法

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

中兴光猫配置解密工具完整技术指南:深度解析与实战应用

中兴光猫配置解密工具完整技术指南&#xff1a;深度解析与实战应用 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 中兴光猫配置解密工具是一款基于Qt框架开发的专业级网络…...

小白程序员入门网络安全:收藏版,从零开始学密码学

小白程序员入门网络安全&#xff1a;收藏版&#xff0c;从零开始学密码学 本文带领读者进入网络安全的世界&#xff0c;从密码学的发展历史、古典密码、分组密码、流密码、杂凑函数到公钥密码&#xff0c;全面介绍了密码学的基础知识和应用。文章涵盖了凯撒密码、维吉尼亚密码…...

测试文章标题413

测试文章内容这是一篇测试文章...

时间-存储权衡攻击与差分分析的实战解析:密码学攻防新视角

1. 时间-存储权衡攻击&#xff08;TMTO&#xff09;的本质与原理 我第一次接触TMTO攻击是在分析一个老旧加密系统漏洞时。这种攻击方法最吸引人的地方在于它巧妙地平衡了计算时间和存储空间的关系&#xff0c;就像用硬盘空间换取破解速度的"作弊码"。想象你面前有个带…...

3分钟搞定iPhone USB网络共享:Windows用户的终极解决方案

3分钟搞定iPhone USB网络共享&#xff1a;Windows用户的终极解决方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_…...