c++11 标准模板(STL)(std::unordered_set)(九)

news2024/11/25 11:46:53
定义于头文件 <unordered_set>
template<

    class Key,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator<Key>

> class unordered_set;
(1)(C++11 起)
namespace pmr {

    template <class Key,
              class Hash = std::hash<Key>,
              class Pred = std::equal_to<Key>>
    using unordered_set = std::unordered_set<Key, Hash, Pred,
                                             std::pmr::polymorphic_allocator<Key>>;

}
(2)(C++17 起)

查找

 返回匹配特定键的元素数量

std::unordered_set<Key,Hash,KeyEqual,Allocator>::count

size_type count( const Key& key ) const;

(1)(C++11 起)

template< class K >
size_type count( const K& x ) const;

(2)(C++20 起)

1) 返回拥有比较等于指定参数 key 的关键的元素数,因为此容器不允许重复故为 1 或 0 。

2) 返回键比较等价于指定参数 x 的元素数。此重载仅若有限定 Hash::transparent_key_equal 合法并指代类型才参与重载决议。这假设能用 KKey 类型一起调用这种 Hash ,还有其 key_equal 是通透的,进而允许不用构造 Key 的实例就调用此函数。

参数

key-要计量等价元素数的键值
x-能通透地与键比较的任何类型值

返回值

1) 拥有关键 key 的元素数,即 1 或 0 。

2) 键比较等价于 x 的元素数。

复杂度

平均为常数,最坏情况与容器大小成线性。

寻找带有特定键的元素

std::unordered_set<Key,Hash,KeyEqual,Allocator>::find

iterator find( const Key& key );

(1)

const_iterator find( const Key& key ) const;

(2)

template< class K > iterator find( const K& x );

(3)(C++20 起)

template< class K > const_iterator find( const K& x ) const;

(4)(C++20 起)

1,2) 寻找键等于 key 的的元素。

3,4) 寻找键比较等价于值 x 的元素。此重载仅若有限定 Hash::transparent_key_equal 合法并指代类型才参与重载决议。这假设能用 KKey 类型一起调用这种 Hash ,还有其 key_equal 是通透的,进而允许不用构造 Key 的实例就调用此函数。

参数

key-要搜索的元素键值
x-能通透地与键比较的任何类型值

返回值

指向键等于 key 的元素的迭代器。若找不到这种元素,则返回尾后(见 end() )迭代器。

复杂度

平均为常数,最坏情况与容器大小成线性。

返回匹配特定键的元素范围

std::unordered_set<Key,Hash,KeyEqual,Allocator>::equal_range

std::pair<iterator,iterator> equal_range( const Key& key );

(1)(C++11 起)

std::pair<const_iterator,const_iterator> equal_range( const Key& key ) const;

(2)(C++11 起)

template< class K >
std::pair<iterator,iterator> equal_range( const K& x );

(3)(C++20 起)

template< class K >
std::pair<const_iterator,const_iterator> equal_range( const K& x ) const;

(4)(C++20 起)

1,2) 返回容器中所有键等于 key 的元素范围。范围以二个迭代器定义,第一个指向所需范围的首元素,而第二个指向范围的尾后一位元素。

3,4) 返回含有容器中所有键等价于 x 的元素的范围。此重载仅若有限定 Hash::transparent_key_equal 合法并指代类型才参与重载决议。这假设能用 KKey 类型一起调用这种 Hash ,还有其 key_equal 是通透的,进而允许不用构造 Key 的实例就调用此函数。

参数

key-要与元素比较的键值
x-任何能与键通透比较的类型的值

返回值

含一对定义所需范围的迭代器的 std::pair 。若无这种元素,则将尾后(见 end() )迭代器作为 pair 的两个元素返回。

复杂度

平均情况与带关键 key 的元素数成线性,最坏情况与容器大小成线性。

调用示例

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <unordered_set>
#include <time.h>

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

struct myCompare
{
    bool operator()(const int &a, const int &b)
    {
        return a < b;
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

std::ostream &operator<<(std::ostream &os, const std::pair<const int, Cell> &pCell)
{
    os << pCell.first << "-" << pCell.second;
    return os;
}

struct CHash
{
    size_t operator()(const Cell& cell) const
    {
        size_t thash = std::hash<int>()(cell.x) | std::hash<int>()(cell.y);
//        std::cout << "CHash: " << thash << std::endl;
        return thash;
    }
};

struct CEqual
{
    bool operator()(const Cell &a, const Cell &b) const
    {
        return a.x == b.x && a.y == b.y;
    }
};

int main()
{
    std::cout << std::boolalpha;

    std::mt19937 g{std::random_device{}()};
    srand((unsigned)time(NULL));

    auto generate = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    std::unordered_set<Cell, CHash, CEqual> unordered_set1;
    //6) 插入来自 initializer_list ilist 的元素。若范围中的多个元素拥有比较等价的关键,则插入哪个元素是未指定的
    unordered_set1.insert({generate(), generate(), generate(), generate(), generate(), generate()});
    std::cout << "unordered_set1:   ";
    std::copy(unordered_set1.begin(), unordered_set1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    for (std::unordered_set<Cell, CHash, CEqual>::const_iterator cit =
                unordered_set1.cbegin(); cit != unordered_set1.end(); cit++)

    {
        //1) 返回拥有比较等于指定参数 key 的关键的元素数,因为此容器不允许重复故为 1 或 0 。
        std::cout << "unordered_set1 count(" << *cit << ") :    "
                  << unordered_set1.count(*cit) << std::endl;
    }
    std::cout << std::endl;


    for (std::unordered_set<Cell, CHash, CEqual>::const_iterator cit =
                unordered_set1.cbegin(); cit != unordered_set1.end(); cit++)

    {
        //1,2) 寻找键等于 key 的的元素。
        std::unordered_set<Cell, CHash, CEqual>::const_iterator fit = unordered_set1.find(*cit);
        std::cout << "unordered_set1 find(" << *cit << ") :    " << *fit << std::endl;
    }
    std::cout << std::endl;


    for (std::unordered_set<Cell, CHash, CEqual>::const_iterator cit =
                unordered_set1.cbegin(); cit != unordered_set1.end(); cit++)

    {
        //1,2) 返回容器中所有键等于 key 的元素范围。
        //范围以二个迭代器定义,第一个指向所需范围的首元素,而第二个指向范围的尾后一位元素。
        std::pair<std::unordered_set<Cell, CHash, CEqual>::const_iterator,
            std::unordered_set<Cell, CHash, CEqual>::const_iterator> pit = unordered_set1.equal_range(*cit);
        std::cout << "unordered_set1 equal_range(" << *cit << ") :  ";
        for (std::unordered_set<Cell, CHash, CEqual>::const_iterator it = pit.first; it != pit.second; it++)
        {
            std::cout << *it << " ";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;

    return 0;
}

输出

 

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

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

相关文章

Linux学习(8.5)文件内容查阅

目录 文件内容查阅&#xff1a; 直接检视文件内容 cat (concatenate) tac (反向列示) nl (添加行号列印) 可翻页检视 more (一页一页翻动) less (一页一页翻动) 数据撷取 tail (取出后面几行) 非纯文字档&#xff1a; od 修改文件时间或建置新档&#xff1a; touc…

数据结构(六)二叉树

一、树形结构概念树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;1、有一个…

昇腾AI新技能,还能预防猪生病?

国药集团动物保健股份有限公司&#xff08;简称“国药动保”&#xff09;是专业从事动物保健产品研发、生产和销售的国家高新技术企业&#xff0c;是国内少数几家具备新产品原创能力的动物保健企业。其中&#xff0c;猪圆环病毒灭活疫苗等市场份额位居行业前列。 “猪圆环病毒…

【Linux学习笔记】8.Linux yum 命令和apt 命令

前言 本章介绍Linux的yum命令和apt命令。 Linux yum 命令 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xf…

一种全新的图像滤波理论的实验(三)

一、前言 2023年02月22日&#xff0c;我发布了滤波后&#xff0c;为针对异常的白色和黑色像素进行处理的实验&#xff0c;本次发布基于上下文处理的方案的实验&#xff0c;目的是通过基于加权概率模型滤波后&#xff0c;在逆滤波时直接修复大量的白色和黑色的异常像素&#xf…

html css输入框获得焦点、失去焦点效果

input输入框获得焦点、失去焦点效果 废话shao shuo ! 直接看效果图&#xff0c;好吧&#xff01; 效果图&#xff1a; code: <!DOCTYPE html> <html> <head><title></title><meta charset"utf-8" /><style type"text…

电子统计台账:海量数据中导入特定行,极力减少键盘编辑工作量

1 前言从事企业统计工作的小伙伴&#xff0c;本来已经够忙的了&#xff0c;现在又要加上什么电子台账这种鬼任务&#xff0c;而且居然还要每月来一次&#xff0c;简直不能忍。如果非要捏着鼻子忍了&#xff0c;那么有什么办法&#xff0c;减轻工作量&#xff1f;2 问题的提出有…

应用场景五: 西门子PLC通过Modbus协议连接DCS系统

应用描述&#xff1a; 西门子PLC&#xff08;S7200/300/400/200SMART&#xff09;通过桥接器可以支持ModbusRTU串口和ModbusTCP以太网&#xff08;有线和无线WIFI同时支持&#xff09;两种通讯方式连接DCS系统&#xff0c;不需要编程PLC通讯程序&#xff0c;直接在模块中进行地…

【数据库】第九章 关系查询处理与优化

第九章 关系查询处理与优化 索引 索引文件是一种辅助存储结构&#xff0c;其存在与否不改变存储表的物理存储结 构&#xff1b;然而其存在&#xff0c;可以明显提高存储表的访问速度。 索引文件组织方式有两种&#xff1a;(相对照的&#xff0c;主文件组织有堆文件、排序文件、…

Python3-字符串

Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。 Python 访问字符串中的值 Python 不支持单字符类型&#xff0c;单字符在 Python 中也是作为一个字符串使用…

行测-判断推理-图形推理-位置规律-旋转、翻转

短指针每次逆时针旋转60&#xff08;排除法选C走人&#xff09;长指针每次顺时针旋转120选C左上菱形每次顺时针旋转90&#xff08;排除C D&#xff09;右上每次旋转180&#xff08;选B走人&#xff09;左下每次保持不变右下每次逆时针旋转90选B左上和右上为左右翻转&#xff0c…

结合JasperReports输出报表

结合JasperReports输出报表 前面我们已经使用Jaspersoft Studio设计了两个模板文件&#xff1a;demo1.jrxml和demo2.jrxml。其中demo1.jrxml的动态列表数据是基于JDBC数据源方式进行数据填充&#xff0c;demo2.jrxml的动态列表数据是基于JavaBean数据源方式进行数据填充。本小节…

ATTCK实战系列-红队评估(一)

from ATT&CK实战系列-红队评估(一) 环境搭建 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 将三个虚拟机启动起来 除了windows 7那个主机&#xff0c;其他都只设置成仅主机模式 windows 7添加两个网卡&#xff0c;一个是仅主机&#xff0c;一个是NAT …

解决SpringBoot中@RequestBody不能和Multipart同时传递的问题

问题描述 今天在做文件上传的时候&#xff0c;遇到了这么一个错误日志&#xff1a; Resolved[org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘multipart/form-data;boundary--------------------------771899451541318130280588;charsetUTF-8’…

[牛客Hot101]链表篇

文章目录1.翻转链表2.链表内指定区间翻转3. 链表中的节点每k个一组翻转4. 合并两个排序的链表5. 合并k个排序的链表6. 判断链表是否有环7. 链表中倒数第k个节点8. 删除链表中的倒数第k和节点9. 两个链表的第一个公共节点10.链表的入环节点11. 链表相加&#xff08;二&#xff0…

mac 如何设置 oh my zsh 终端terminal 和添加主题powerlevel10k

Oh My Zsh 是什么 Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。 **Oh …

Buuctf reverse [FlareOn4]IgniteMe 题解

一. 查壳 无壳32位程序 二. ida打开 GetStdHandle函数根据微软官方文档可以得知是获取标准输入/输出/错误的句柄 参数里的 0xFFFFFFF6转换一下是4294967286, 对应(DWORD) -10 所以这里的WriteFile函数实际上是实现了printf的功能 sub_4010F0()函数 其功能是通过ReadFile函数读取…

Java EE|TCP/IP协议栈之数据链路层协议详解

文章目录一、数据链路层协议感性认识数据链路层简介以太网简介特点二、以太网数据帧格式详解帧头不同类型对应的载荷三、关于MTU什么是MTUMTU有什么作用ip分片&#xff08;了解&#xff09;参考一、数据链路层协议感性认识 数据链路层简介 从上图可以看出 &#xff0c; 在TCP/…

「JVM 高效并发」Java 线程

进程是资源分配&#xff08;内存地址、文件 I/O 等&#xff09;的基本单位&#xff0c;线程是执行调度&#xff08;处理器资源调度&#xff09;的基本单位&#xff1b; Loom 项目若成功为 Java 引入纤程&#xff08;Fiber&#xff09;&#xff0c;则线程的执行调度单位可能变为…

搭建Vue工程

搭建Vue工程 localhost 127.0.0.1 域名 IP 192.168.0.28 联网IP 最后都会渲染到一个页面里面&#xff0c;有多少个页面就有多少个页面模板。 vue里面改webpack配置 vue.config.js 配置参考 | Vue CLI /assets /api* 开发的时候用到的请求后台地址 和 项目真实部署上线的时候 请…