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 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
