c++ 11标准模板(STL) std::set(二)

news2025/1/19 23:10:27
定义于头文件 <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) 的要求。

成员函数

构造 set

std::set<Key,Compare,Allocator>::set
set();

explicit set( const Compare& comp,

              const Allocator& alloc = Allocator() );
(1)

explicit set( const Allocator& alloc );

(C++11 起)
template< class InputIt >

set( InputIt first, InputIt last,
     const Compare& comp = Compare(),

     const Allocator& alloc = Allocator() );
(2)
template< class InputIt >

set( InputIt first, InputIt last, const Allocator& alloc)

    : set(first, last, Compare(), alloc) {}
(C++14 起)

set( const set& other );

(3)

set( const set& other, const Allocator& alloc );

(3)(C++11 起)

set( set&& other );

(4)(C++11 起)

set( set&& other, const Allocator& alloc );

(4)(C++11 起)
set( std::initializer_list<value_type> init,

     const Compare& comp = Compare(),

     const Allocator& alloc = Allocator() );
(5)(C++11 起)

set( std::initializer_list<value_type> init, const Allocator& alloc )
    : set(init, Compare(), alloc) {}

(C++14 起)

 

从各种数据源,可选地用用户提供的分配器 alloc 或比较函数对象 comp 构造新容器。

1) 默认构造函数。构造新容器。

2) 范围构造函数。构造拥有范围 [first, last) 内容的容器。若范围中的多个元素拥有比较等价的关键,则插入哪个元素是未指定的(待决的 LWG2844 )。

3) 复制构造函数。以 other 内容的副本构造容器。若不提供 alloc ,则通过调用 std::allocator_traits<allocator_type>::select_on_container_copy_construction(other.get_allocator()) 获得分配器。

4) 移动构造函数。用移动语义构造拥有 other 内容的容器。若不提供 alloc ,则以从属于 other 的分配器移动构造获得分配器。

5) initializer_list 构造函数。构造拥有 initializer_list init 内容的容器。若范围中的多个元素拥有比较等价的关键,则插入哪个元素是未指定的(待决的 LWG2844 )。

参数

alloc-用于此容器所有内存分配的分配器
comp-用于所有关键比较的比较函数对象
first, last-复制元素的来源范围
other-将用作初始化容器元素所用源的另一容器
init-初始化容器元素所用的 initializer_list
类型要求
- InputIt 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。
- Compare 必须满足比较 (Compare) 的要求。
- Allocator 必须满足分配器 (Allocator) 的要求。

复杂度

1) 常数

2) 通常为 N log(N) ,若范围已经由 value_comp() 排序则与 N 成线性,其中 N = std::distance(first, last) 。

3) 与 other 的大小成线性。

4) 常数。若给定 alloc 而 alloc != other.get_allocator() ,则为线性。

5) N log(N) ,其中通常有 N = init.size()) 。若 init 已按照 value_comp() 排序则与 N 成线性。

异常

调用 Allocator::allocate 可能抛出。

注意

在容器移动构造(重载 (4) )后,指向 other 的引用及迭代器(除了尾迭代器)保持合法,但指代现于 *this 中的元素。当前标准由 [container.requirements.general]/12 中的总括陈述作出此保证,而 LWG 2321 正在考虑更严格的保证。

析构 set

std::set<Key,Compare,Allocator>::~set

~set();

销毁容器。调用元素的析构函数,然后解分配所用的存储。注意,若元素是指针,则不销毁所指向的对象。

复杂度

与容器大小成线性。

调用示例

#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()
{
    //1) 构造空容器。
    std::set<Cell> set1;
    std::cout << "set1 is empty " << set1.empty() << std::endl;
    std::cout << std::endl;


    std::vector<Cell> vector1{{101, 101}, {102, 102}, {103, 103}, {104, 104}, {105, 105}};

    //2) 构造容器,使之拥有范围 [first, last) 的内容。
    std::set<Cell> set2(vector1.begin(), vector1.end());
    std::cout << "set2:    ";
    std::copy(set2.begin(), set2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::set<Cell, std::greater<Cell>> set3(vector1.begin(), vector1.end());
    std::cout << "set3:    ";
    std::copy(set3.begin(), set3.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;


    //3) 复制构造函数。构造容器,使之拥有 other 的内容副本。
    std::set<Cell> set4(set2);
    std::cout << "set4:    ";
    std::copy(set4.begin(), set4.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::set<Cell, std::greater<Cell>> set5(set3);
    std::cout << "set5:    ";
    std::copy(set5.begin(), set5.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;


    //4) 移动构造函数。用移动语义构造容器,使之拥有 other 的内容。
    std::set<Cell> set6(std::move(set2));
    std::cout << "set6:    ";
    std::copy(set6.begin(), set6.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::set<Cell, std::greater<Cell>> set7(std::move(set3));
    std::cout << "set7:    ";
    std::copy(set7.begin(), set7.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;


    //5) 构造容器,使之拥有 initializer_list init 的内容。
    std::set<Cell> set8{{101, 101}, {102, 102}, {103, 103}, {104, 104}, {105, 105}};
    std::cout << "set8:    ";
    std::copy(set8.begin(), set8.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::set<Cell, std::greater<Cell>> set9{{101, 101}, {102, 102}, {103, 103}, {104, 104}, {105, 105}};
    std::cout << "set9:    ";
    std::copy(set9.begin(), set9.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}

输出

 

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

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

相关文章

超实用!50+个ChatGPT提示词助你成为高效Web开发者(上)

如果你已经感到编写代码的重复和繁琐让你疲惫不堪&#xff0c;想要提高自己的效率&#xff0c;那么你来对地方了。ChatGPT是一款能够帮助你优化工作流程、减少错误并获得提高代码的见解的强大工具。 在这篇博客文章中&#xff0c;我们将向你提供超过50个提示和策略&#xff0c;…

OpenCV教程——形态学操作。膨胀,腐蚀,开操作,闭操作,形态学梯度,顶帽,黑帽

1.形态学操作 图像形态学操作&#xff1a;基于形状的一系列图像处理操作的合集&#xff0c;主要是基于集合论基础上的形态学数学。 形态学有四个基本操作&#xff1a;膨胀、腐蚀、开、闭。 2.膨胀与腐蚀 2.1.膨胀 跟卷积操作类似&#xff0c;假设有图像A和结构元素B&#…

路径规划算法:基于灰狼优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于灰狼优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于灰狼优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法灰狼…

自媒体的孔雀效应:插根鸡毛还是专业才华?

自媒体时代&#xff0c;让许多原本默默无闻的人找到了表达自己的平台。有人声称&#xff0c;现在这个时代&#xff0c;“随便什么人身上插根鸡毛就可以当孔雀了”。可是&#xff0c;事实真的如此吗&#xff1f; 首先&#xff0c;我们不能否认的是&#xff0c;自媒体确实为大众提…

【大数据】通过 docker-compose 快速部署 Presto(Trino)保姆级教程

文章目录 一、概述二、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 三、创建网络四、Trino 编排部署1&#xff09;下载 trino2&#xff09;配置1、coordinator 配置2、worker 配置 3&#xff09;启动脚本 bootstrap.sh4&#xff09;构建镜像 Dockerfile…

多尺度深度特征(下):多尺度特征学习才是目标检测精髓(论文免费下载)...

计算机视觉研究院专栏 作者&#xff1a;Edison_G 深度特征学习方案将重点从具有细节的具体特征转移到具有语义信息的抽象特征。它通过构建多尺度深度特征学习网络 (MDFN) 不仅考虑单个对象和局部上下文&#xff0c;还考虑它们之间的关系。 公众号ID&#xff5c;ComputerVisionG…

MySQL- 存储引擎

MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念&#xff0c;为通过认证安全接入的客户端…

通过自动装箱和拆箱解释所定义基础数据类型和其对应封装类的区别

文章目录 前言一、拆装箱的实质二、拓展1.数值超过128的Integer装箱2.Java内存分配 前言 在刷软中的时候涉及到了值传递和地址传递传参的区别&#xff0c;其中提到不管是将基础数据类型的变量传值给对象数据类型的变量还是反过来都属于值传递&#xff0c;究其原因就是期间发生了…

【本地模式】第一个Mapreduce程序-wordcount

【本地模式】&#xff1a;也就是在windows环境下通过hadoop-client相关jar包进行开发的&#xff0c;我们只需要通过本地自己写好MapReduce程序即可在本地运行。 一个Maprduce程序主要包括三部分&#xff1a;Mapper类、Reducer类、执行类。 map阶段&#xff1a;将每一行单词提…

XShell远程连接

xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1,SSH2以及microsoft windows 平台的TELNET协议。xshell通过互联网到远程主机的安全连接。 xshell可以在windows界面下来访问远程终端不同系统下的服务器&#xff0c;从而比较好的达到远程控制终端的目的。 步骤一 …

MySQL- 索引

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外, 数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用数据, 这样就可以在这些数据结构上实现高级查找算法, 这种数据结构就是索引。 索引结构 MySQL的索引是在存储层实现的, 不同的存储引擎有…

网友总结:面试超过一个小时,通过概率更低;面试时长在半小时以内,通过概率更高!...

面试时长跟通过概率有关系吗&#xff1f; 一位网友分享了自己的求职感想&#xff1a; 面试过程越长&#xff0c;差不多一个小时或者超过一个小时&#xff0c;问得越详细&#xff0c;通过的可能性越低。因为问得越细&#xff0c;说明这个公司越挑&#xff0c;需要候选人匹配度越…

【C++ 入坑指南】(05)数据类型

文章目录 一、整型sizeof 关键字 二、实型&#xff08;浮点型&#xff09;三、字符型四、字符串型4.1 C 风格字符串4.2 C 引入的 string 类类型 五、布尔类型&#xff08;bool&#xff09;六、类型转换6.1 静态转换&#xff08;Static Cast&#xff09;6.2 动态转换&#xff08…

软考A计划-真题-分类精讲汇总-第六章(软件工程)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

阿里云服务器安装宝塔Linux面板教程图解

使用阿里云服务器安装宝塔面板教程&#xff0c;阿里云服务器网以CentOS操作系统为例&#xff0c;安装宝塔Linux面板&#xff0c;先远程连接到云服务器&#xff0c;然后执行宝塔面板安装命令&#xff0c;系统会自动安装宝塔面板&#xff0c;安装完成后会返回面板地址、账号和密码…

【mongoDB】mongodb权限验证 || mongodb重启 || mongodb常用命令

mongodb版本号 6.0 前言 mongoDB刚开始无需密码登录mongoDB有3默认数据库&#xff0c;分别为&#xff1a; admin 超级用户&#xff0c;能对所有数据库操作&#xff0c;执行管理员命令config 分片集群配置的数据库local 分片集群锁信息的集合test 这个数据库一般是隐式创建的&…

新书出版了(文末送书)

大家好&#xff0c;我是麦哥。 最近一位好友的新书出版了&#xff0c;由衷的替他开心&#xff0c;赶紧来支持一波。 新书长这样 这本书的作者是前中兴高级工程师&#xff0c;某知名培训机构的教学总监&#xff0c;现于某研究所担任重要的研发工作&#xff0c;我喜欢叫他彭老师。…

路径规划算法:基于蚁狮优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于蚁狮优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蚁狮优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法蚁狮…

路径规划算法:基于蝗虫优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于蝗虫优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蝗虫优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法蝗虫…

Python爬虫之美丽的汤——BeautifulSoup

本文概要 本篇文章主要介绍利用Python爬虫之美丽的汤——BeautifulSoup&#xff0c;适合练习爬虫基础同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; 是不是以为今天要教大家怎么做饭&#xff1f;确实&…