首页 > 编程语言 >C++容器之无序集(std::unordered_set)

C++容器之无序集(std::unordered_set)

时间:2024-05-25 17:31:42浏览次数:27  
标签:std set EQUALS C++ ASSERT TEST unordered

目录

1 概述

  无序集是不按特定顺序存储唯一元素的容器,允许根据单个元素的值快速检索这些元素。
  在一个无序集合中,元素的值同时也是唯一标识它的键。键是不可变的,因此,不能在容器中修改无序集中的元素,但它们可以插入和移除。
  在内部,无序集中的元素不按任何特定顺序排序,而是根据其哈希值组织到桶中,以允许直接根据其值快速访问各个元素(平均具有恒定的平均时间复杂度)。
  无序集合容器比集合容器更快地通过关键字访问单个元素,尽管它们通常在通过元素子集进行范围迭代时效率较低。
  容器中的迭代器至少是前向迭代器。

容器特性:

  • 关联性 关联容器中的元素由它们的键(Key)引用,而不是由它们在容器中的绝对位置引用。
  • 无序性 无序容器使用哈希表来组织其元素,哈希表允许通过其键快速访问元素。
  • 集合 元素的值也是用来识别它的键(Key)。
  • 唯一性 容器中没有两个元素可以具有等效的键。
  • 分配器感知 容器使用分配器对象来动态处理其存储需求。
  • 其类图如下:
    类图

2 使用实例

void UnorderedSetSuite::rehash()
{
   
    std::unordered_set<std::string> a;

    a.rehash(12);
    TEST_ASSERT_EQUALS(true, a.bucket_count() > 12)

    a.insert("James");
    a.insert("Tom");
    a.insert("Jim");
    a.insert("Rose");
    a.insert("Geore");

    uint32_t bucket_count = a.bucket_count();
    a.rehash(11);
    TEST_ASSERT_EQUALS(bucket_count, a.bucket_count())

    a.rehash(5);
    TEST_ASSERT_EQUALS(true, a.bucket_count() < bucket_count)
}

3 接口使用

3.1 construct

template<class T>
T merge_set(T const & a, T const& b)
{
   
    T t(a);
    t.insert(b.begin(), b.end());
    return t;
}

void UnorderedSetSuite::construct()
{
   
    std::unordered_set<int> a;
    std::unordered_set<int> b({
    1, 2, 3, 3 });
    std::unordered_set<int> c({
    4, 5, 6, 6 });
    std::unordered_set<int> d(b);
    std::unordered_set<int> e(merge_set(b, c));
    std::unordered_set<int> f(e.begin(), e.end());

    TEST_ASSERT_EQUALS(true, a.empty())
    TEST_ASSERT_EQUALS(3, b.size())
    TEST_ASSERT_EQUALS(3, c.size())
    TEST_ASSERT_EQUALS(3, d.size())
    TEST_ASSERT_EQUALS(6, e.size())
    TEST_ASSERT_EQUALS(6, f.size())
}

3.2 assigns

void UnorderedSetSuite::assigns()
{
   
    std::unordered_set<int> a;
    std::unordered_set<int> b;
    std::unordered_set<int> c;
    std::unordered_set<int> d;
    a = {
    1, 2, 3, 3 };
    b = {
    4, 5, 6, 6 };
    c = merge_set(a, b);
    d = c;
    
    TEST_ASSERT_EQUALS(3, a.size())
    TEST_ASSERT_EQUALS(3, b.size())
    TEST_ASSERT_EQUALS(6, c.size())
    TEST_ASSERT_EQUALS(6, d.size())
}

3.3 iterators

void UnorderedSetSuite::iterators()
{
   
    std::unordered_set<std::string> names = 
    {
    "James", "Tom", 

标签:std,set,EQUALS,C++,ASSERT,TEST,unordered
From: https://blog.csdn.net/flysnow010/article/details/139200311

相关文章

  • Content-Type 'application/json;charset=UTF-8' is not supported异常解决
    Content-Type'application/json;charset=UTF-8'isnotsupported异常解决前提:确定不是因为Content-Type导致的异常,controller层有注解@RequestBody。报错详情:确定不是因为缺少Jackson依赖或者版本过低:注意到报错信息上边有一条警告日志:.c.j.MappingJackson2HttpMessageCo......
  • 原始字面常量(C++11)
    原始字面常量(C++11)文章目录原始字面常量(C++11)前言一、原始字面量二、代码示例总结前言字面量一般是指数值(12、454等)和字符串(“Hw”、“h\t”),但是有时候我们想表达字符原始的意义,不想进行转义,比如说"h\t"字符串中‘\t’表达的意思是制表符即进行了转义,C++11添加了......
  • Settings里面切换不同Launcher的代码流程
    1.Android\packages\modules\Permission\PermissionController中的DefaultAppActivity中接收,根据packagename进行追踪路径如下:DefaultAppActivity.java--->HandheldDefaultAppFragment.java--->DefaultAppChildFragment.java:setDefaultApp()--->ManageRoleHolderState......
  • Redis 源码学习记录:集合 (set)
    无序集合Redis源码版本:Redis-6.0.9,本篇文章无序集合的代码均在intset.h/intset.c文件中。Redis通常使用字典结构保存用户集合数据,字典键存储集合元素,字典值为空。如果一个集合全是整数,则使用字典国语浪费内存。为此,Redis设计了intset数据结构,专门用来保存整数......
  • C++基础知识学习笔记(4)——引用
    学习参考:https://www.bilibili.com/video/BV1et411b73Z?p=89&spm_id_from=pageDriver&vd_source=cc561849591f6a210152150b2493f6f3引用作用:给变量起别名语法:数据类型&变量=原变量;intmain(){ inta=10; int&b=a; b=20; cout<<b<<endl;//20 co......
  • Qt - Qt6中QTextStream类的setCodec方法没有了,怎么解决写中文文本乱码
    简介场景:程序在linux下运行,将中英文写入文本,将文本在windows上打开时,中文出现乱码 原Qt5中:QFilefile;file.open(QIODevice::WriteOnly|QIODevice::Text);QTextStreamtextStream(&file);textStream.setCodec("GBK");使用 QTextStream类的 setCodec方法即可解决上......
  • C++ - 比较两个浮点数大小
    简介两个浮点数不能直接使用 ==来确定相等,因为浮点数精度可能导致微小的误差 方法一:使用std::abs()函数来比较两个浮点数的差值是否小于一个非常小的阈值floata=1.5;floatb=2.3;floatepsilon=1e-9;if(std::abs(a-b)<epsilon){cout<<"aiseq......
  • C++基础知识学习笔记(3)
    资料来源https://www.bilibili.com/video/BV1et411b73Z?p=84&vd_source=cc561849591f6a210152150b2493f6f3核心内容程序的内存模型代码区全局区在函数外面声明了全局变量,在main函数里面创建了局部变量,打印了其地址:静态变量:在普通变量前面加一个static,属于静态变量。静......
  • 【C++】回文数判断(for循环,简易思路)
    #include<stdio.h>#include<string.h>#include<iostream>usingnamespacestd;intmain(){chara[1001];intn,i,j;cin>>a;//输入字符串,注意:这里不会处理空格n=strlen(a);/......
  • C++ const关键字
    C++const关键字记得有次面试carmeraturning岗,面试官让我谈谈const关键字的作用我提到被const修饰变量会存入.rodata的只读数据段不可更改,面试官好像不是很满意,现在想想carmeraturning岗位好像主要用C++,面试官当时是想让我说说C++中const关键字的作用。C++中const关键字的作用......