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

news2024/11/22 11:00:43
定义于头文件 <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>::begin, 
std::set<Key,Compare,Allocator>::cbegin

iterator begin();

(C++11 前)

iterator begin() noexcept;

(C++11 起)

const_iterator begin() const;

(C++11 前)

const_iterator begin() const noexcept;

(C++11 起)

const_iterator cbegin() const noexcept;

(C++11 起)

 返回指向容器首元素的迭代器。

若容器为空,则返回的迭代器将等于 end() 。

 

参数

(无)

返回值

指向首元素的迭代器。

复杂度

常数。

注意

因为 iteratorconst_iterator 都是常迭代器(而且实际上可以是同一类型),故不可能通过任何这些成员函数返回的迭代器修改容器元素。

返回指向容器尾端的迭代器

std::set<Key,Compare,Allocator>::end, 
std::set<Key,Compare,Allocator>::cend

iterator end();

(C++11 前)

iterator end() noexcept;

(C++11 起)

const_iterator end() const;

(C++11 前)

const_iterator end() const noexcept;

(C++11 起)

const_iterator cend() const noexcept;

(C++11 起)

 返回指向容器末元素后一元素的迭代器。

此元素表现为占位符;试图访问它导致未定义行为。

 

参数

(无)

返回值

指向后随最后元素的迭代器。

复杂度

常数。

注意

因为 iteratorconst_iterator 都是常迭代器(而且实际上可以是同一类型),故不可能通过任何这些成员函数返回的迭代器修改容器元素。

返回指向容器最后元素的逆向迭代器

std::set<Key,Compare,Allocator>::rbegin, 
std::set<Key,Compare,Allocator>::crbegin

reverse_iterator rbegin();

(C++11 前)

reverse_iterator rbegin() noexcept;

(C++11 起)

const_reverse_iterator rbegin() const;

(C++11 前)

const_reverse_iterator rbegin() const noexcept;

(C++11 起)

const_reverse_iterator crbegin() const noexcept;

(C++11 起)

 返回指向逆向容器首元素的逆向迭代器。它对应非逆向容器的末元素。

 

参数

(无)

返回值

指向首元素的逆向迭代器。

复杂度

常数。

注意

因为 iteratorconst_iterator 都是常迭代器(而且实际上可以是同一类型),故不可能通过任何这些成员函数返回的迭代器修改容器元素。

返回指向前端的逆向迭代器

std::set<Key,Compare,Allocator>::rend, 
std::set<Key,Compare,Allocator>::crend

reverse_iterator rend();

(C++11 前)

reverse_iterator rend() noexcept;

(C++11 起)

const_reverse_iterator rend() const;

(C++11 前)

const_reverse_iterator rend() const noexcept;

(C++11 起)

const_reverse_iterator crend() const noexcept;

(C++11 起)

返回指向逆向容器末元素后一元素的逆向迭代器。它对应非逆向容器首元素的前一元素。此元素表现为占位符,试图访问它导致未定义行为。

 

参数

(无)

返回值

指向末元素后一元素的逆向迭代器。

复杂度

常数。

注意

因为 iteratorconst_iterator 都是常迭代器(而且实际上可以是同一类型),故不可能通过任何这些成员函数返回的迭代器修改容器元素。

 

调用示例

#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;
    };

    //返回指向容器首元素的迭代器。若容器为空,则返回的迭代器将等于 end() 。
    //返回指向容器末元素后一元素的迭代器。此元素表现为占位符;试图访问它导致未定义行为。
    //返回指向逆向容器首元素的逆向迭代器。它对应非逆向容器的末元素。
    //返回指向逆向容器末元素后一元素的逆向迭代器。
    //它对应非逆向容器首元素的前一元素。此元素表现为占位符,试图访问它导致未定义行为。

    std::set<Cell> set1{generate(), generate(), generate(), generate(), generate()};
    std::cout << "set1 const it:           ";
    for (std::set<Cell>::const_iterator cit = set1.cbegin(); cit != set1.cend(); cit++)
    {
        std::cout << *cit << " ";
    }
    std::cout << std::endl;
    std::cout << std::endl;

    std::cout << "set1 it:                 ";
    for (std::set<Cell>::iterator it = set1.begin(); it != set1.end(); it++)
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    std::cout << std::endl;

    std::cout << "set1 const reverse it:   ";
    for (std::set<Cell>::const_reverse_iterator crit = set1.crbegin(); crit != set1.crend(); crit++)
    {
        std::cout << *crit << " ";
    }
    std::cout << std::endl;
    std::cout << std::endl;

    std::cout << "set1 reverse it:         ";
    for (std::set<Cell>::reverse_iterator rit = set1.rbegin(); rit != set1.rend(); rit++)
    {
        std::cout << *rit << " ";
    }
    std::cout << std::endl;
    std::cout << std::endl;
    return 0;
}

输出

 

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

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

相关文章

让 ChatGPT 来担任这个召之即来挥之即去的私人健身教练

健身教练 和ChatGPT聊天可以运用在各种正式、非正式&#xff0c;工作、休闲场合&#xff0c;让我们再来看一个场景&#xff0c;也是年轻人群体中非常热门的话题&#xff1a;健身。健身已经是年轻人最流行的活动&#xff0c;既可以是私密的个人健身&#xff0c;也可以是呼朋唤友…

JAVA集合,复杂度,泛型

泛型: 1.存储数据的时候 可以帮我们进行自动的类型检查 2.获取元素的时候&#xff0c;可以帮我们进行类型转换 获取数据时&#xff0c;不需要强转类型转换。 类型形参一般使用一个大写字母表示&#xff0c;常用的名称有&#xff1a; E 表示 Element K 表示 Key V 表示 …

多目标跟踪:视觉联合检测和跟踪

国内头部以自动驾驶全站技术为主线的交流学习社区&#xff08;感知、归控等&#xff09;&#xff0c;包含大量前沿论文解读、工程实践(源代码)、视频课程&#xff0c;热招岗位。欢迎加入&#xff01; 点击上方“迈微AI研习社”&#xff0c;选择“星标★”公众号 重磅干货&#…

Python每日一练(20230516) 打家劫舍 I\II\III\IV HouseRobber

目录 1. 打家劫舍 I House Robber i 2. 打家劫舍 II House Robber ii 3. 打家劫舍 III House Robber iii 4. 打家劫舍 IV House Robber iv &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

除了OA以外,只用点击按钮就能实现协同办公,靠一个工具就能实现

OA不同时期&#xff0c;不同功能 OA是办公自动化系统&#xff0c;与互联网技术的发展有着密切的联系。 很多办公场景都离不开OA协同系统。OA是办公系统&#xff0c;借助与互联网的交互性&#xff0c;开创出的一种新型的办公方式。 所以&#xff0c;说到OA软件&#xff0c;在不…

Linux 网络基础(1)基础知识、IP地址、端口、协议、网络字节序

基础知识 网络发展背景&#xff1a; 网络的划分&#xff1a;局域网&#xff08;覆盖范围在1000m以内&#xff09;、城域网&#xff08;覆盖范围在20km以内&#xff09;、广域网&#xff08;更大范围&#xff09; 组网方式&#xff1a;以太网、令牌环网.... 日常名词&#xff1a…

ChatGPT「最强竞争对手」Claude有了史诗级更新~~~百页数据一分钟读完还能做出总结

号称ChatGPT「最强竞争对手」的Claude&#xff0c;迎来史诗级更新—— 模型记忆力原地起飞&#xff0c;现在1分钟看完一本数万字的小说&#xff0c;已经是一件很理所当然的事情了。 消息一出&#xff0c;评论区直接炸了&#xff0c;网友们蜂拥而至&#xff0c;「wocao连连」&am…

报表解决方案Telerik Reporting - 轻松完成嵌入式报表开发

假设您是一名开发人员&#xff0c;思考一下您的用户将从Web报表设计器中得到什么吗&#xff1f;他们能突出异常数据吗?他们能够从头开始创建一个报告吗?让我们站在商业用户的角度&#xff0c;看看这到底是怎么回事。 Telerik Reporting Web Designer是一个多功能且用户友好的…

Redis系列--redis管道

一、前言 1、reids客户端向服务端发送命令分四步&#xff08;发送命令-命令排队-命令执行-返回结果&#xff09;&#xff0c;并监听socket返回&#xff0c;通常以阻塞模式等待服务端响应。 2、服务端处理命令&#xff0c;并将结果返回给客户端 以上两步称为&#xff1a;Roun…

榜店商城独立版禾匠队列服务测试失败问题解决方法-开启禾匠队列教程

发现很多用户在安装完成后或者在使用独立版本的过程中可能突然会遇到测试不通过,队列测试失败的情况,安装完成后输入站点域名登录到商城后台,先清理缓存然后进入“设置”-“队列服务”,按要求启动服务并测试服务是否正常运行,如果运行失败的话,如下图所示 这里狮子喵就给…

端子引脚焊接异常分析

No.1 案例概述 PCBA端子引脚焊接发生异常&#xff0c;通过对PCBA基板和端子进行一系列分析&#xff0c;定位到问题发生的原因在于共面性不良&#xff0c;且端子焊接引脚与锡膏接触程度不足导致。详细分析方案&#xff0c;请浏览文章获知。 Q:什么是共面性&#xff1f; 共面性也…

第一章 Java语言概述

一 Java知识脉络图 1.1 Java基础全程脉络图 1.2 本章专题与脉络 二 计算机的硬件与软件 2.1 计算机组成&#xff1a;硬件软件 2.2 CPU、内存与硬盘 CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 人靠大脑思考&#xff0c;电脑靠CPU来运算、控…

LocalAI - 兼容OpenAI API的本地大模型技术栈【LLM】

LocalAI 是一个用于本地推理的 与OpenAI API 规范兼容的REST API&#xff0c; 它允许使用消费级硬件在本地或本地运行模型&#xff0c;支持llama.cpp、alpaca.cpp、gpt4all.cpp、rwkv.cpp、whisper.cpp、vicuna、koala、gpt4all-j、cerebras 等大模型。 推荐&#xff1a;用 NSD…

linux入门---模拟实现命令行解释器

目录标题 前提准备工作 前提 平时使用指令操作linux系统的时候可能会输入一些不好的指令&#xff0c;这些指令可能会对操作系统内核造成影响&#xff0c;所以就有了命令行解释器这个东西&#xff0c;它会过滤掉那些不好的指令从而让linux系统更加的安全&#xff0c;比如说我们…

初识linux之线程池与一些常见的锁

目录 一、线程池的概念 1. 线程池的概念 2. 线程池的应用场景 二、模拟实现一个线程池 1. 线程的简单封装 2. 锁的简单封装 3. 线程池的模拟实现 3.1 整体结构及头文件 3.2 构造函数 3.3 析构函数 3.4 线程启动 3.5 传入任务 3.6 整体结构 三、线程安全的单例模式…

向基于语义模型的操作集成的演变

在过去的许多年里&#xff0c;已经定义了许多架构方法&#xff0c;用于系统集成以及其信息和流程的表示。这些方法包括面向数据、面向消息、面向服务和面向信息的方法。需要探讨的问题是&#xff1a; 这些不同的方法有何不同和联系&#xff1f;从实时运营整合架构的角度来看&a…

MQTT协议理解

提示&#xff1a;记录mqtt服务搭建及访问教程 文章目录 前言一、MQTT是什么&#xff1f;二、使用步骤1.MQTT服务器搭建2.MQTT集成 总结 前言 一直想了解下mqtt&#xff0c;本人又懒&#xff0c;被动型学习&#xff0c;刚好项目需要&#xff0c;此篇记录下MQTT搭建过程及心得体…

小模型媲美2000倍体量大模型,谷歌提出新思路:蒸馏也能Step-by-Step

深度学习自然语言处理 原创作者&#xff1a;林哲乐 论文&#xff1a;Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smaller Model Sizes地址&#xff1a;https://arxiv.org/pdf/2305.02301.pdf录取&#xff1a;ACL2023 进NLP群…

在JavaScript中4种创建枚举方式

本文译者为 360 奇舞团前端开发工程师 原文标题&#xff1a;4 Ways to Create an Enum in JavaScript原文作者&#xff1a;Dmitri Pavlutin原文地址&#xff1a;https://dmitripavlutin.com/javascript-enum/ 使用枚举&#xff08;enum&#xff09;可以方便地表示一个变量&…

一个通用的多相机视觉SLAM框架的设计和评估

文章&#xff1a;Design and Evaluation of a Generic Visual SLAM Framework for Multi-Camera Systems 作者&#xff1a;Pushyami Kaveti, Arvind Thamil Chelvan Hanumant Singh 编辑&#xff1a;点云PCL 来源&#xff1a;https://arxiv.org/pdf/2210.07315.pdf 代码&#x…