unordered_set底层是hash表,使用桶排序,是无序关联容器,设计目的是为了增加,删除,查找更加快速
|场景|unordered_set|set|vector|
|---|---|---|---|
|查找元素|O(1) ✅|O(log n)|O(n)|
|插入元素|O(1) ✅|O(log n)|O(1)末尾|
|去重|自动 ✅|自动|需手动|
|有序性|❌|✅|❌|
set和multiset容器:插入的时候自动排序(关联式容器):底层结构是二叉树(红黑树)
set不允许有重复元素,multiset允许有重复元素
// 包含头文件时只需要包含一个
 
// 构造:1.默认构造 2.拷贝构造
 
// 赋值操作:=
 
// 插入数据时,
只有insert方法,clear,erase;insert返回pair<iterator,bool>;用pair.first和second取出
 
// 大小和交换:empty,size,swap
 set插入数据时会返回是否成功,multiset不会做检测
// 查找和统计:
find:如果存在,返回迭代器,若不存在,返回set.end()的位置;count(key)在set中这可能是0或1,multiset可能大于1
// set排序规则:默认从小到大,利用仿函数,可以改变排序规则
// 1.set存放内置数据类型 2.set存放自定义数据类型
// 自定义数据类型,都会指定排序规则
// pair对组的使用
// 创建方式:1. 2.make_pair
// 不需要包含头文件
#include <unordered_set>

#include <vector>

#include <iostream>

std::vector<int> removeDuplicates2(std::vector<int> nums)

{

    std::unordered_set<int> s(nums.begin(), nums.end());

    return std::vector<int>(s.begin(), s.end());

}

int main(int argc, char const *argv[])

{

    std::unordered_set<int> uset = {4, 5, 6, 8, 9, 11, 12, 13, 17, 18, 19};

    uset.insert(20);

    for (auto x : uset)

    {

        std::cout << x << std::endl;

    }

  

    std::cout << "uset.size()" << uset.size() << std::endl;

    std::cout << "uset.empty()" << uset.empty() << std::endl;

  

    std::cout << "bucket count : " << uset.bucket_count() << std::endl;

    std::cout << "装载因子 load factor bucket factor :" << uset.load_factor() << std::endl;

    // 经典用法 1.count判断是否存在

    if (uset.count(1) > 0)

    {

        std::cout << "0x03u" << std::endl;

        return 0x03u;

    }

    if (uset.find(8) != uset.end())

    {

        std::cout << "判断存在方法2:find" << 8 << std::endl;

    }

    // if (uset.contains(8))

    // {

    //     std::cout<<"c++ 20 特性"

    // }

  

    // 经典用法 2.用set构造去重

    std::vector<int> nums = {4, 2, 4, 1, 2, 3, 1};

    std::vector<int> numremoveDuplicate = removeDuplicates2(nums);

    for (auto x : numremoveDuplicate)

    {

        std::cout << x << " ";

    }

    // 安全删除,c++20有std::erase_if

    if (uset.count(8) > 0)

    {

        uset.erase(8);

        std::cout << "已经删除8" << std::endl;

    }

  

    return 0;

}