C++基础 -- unordered_set

1. 定义

unordered_set<> 容器类型的模板定义在 unordered_set 头文件中。unordered_set<> 容器提供了和 unordered_map<> 相似的能力,但 unordered_set<> 可以用保存的元素作为它们自己的键。其中保存类型的对象在容器中的位置由它们的哈希值决定,因而需要定义一个 Hash<> 函数。

这种容器不能存放重复的元素。元素类型必须可以比较是否相等,因为这可以确定元素什么时候相等。就像 uordered_map,元素被存放在哈希表内部的格子中。每个格子保存哪个元素,是由元素的哈希值决定的。unordered_set 容器组织方式的概念图如图 1 所示:
在这里插入图片描述
如果所计算出的哈希值冲突,则根据一些规则重新分配位置

2. 基本用法

构造方法,插入元素,查找元素,基本信息。删除元素

# include<iostream>
# include<unordered_set>
# include<vector>
using namespace std;
int main(){ 
    unordered_set <string> example{"aaa", "ccc"};
    for (auto element : example){
        cout << element << " " << endl;
    }   // 桶排序输出

    // 插入元素 (由于整个数据结构基于哈希构建,无法插入相同元素)
    cout << "--------------- insert element ---------------" << endl;
    example.insert("ddd");
    for (auto element : example){
        cout << element << " " << endl;
    }
    cout << " --- --- ---" << endl;
    vector <string> inserList{"www", "eee"};
    example.insert(inserList.begin(), inserList.end());
    for (auto element : example){
        cout << element << " " << endl;
    }

    // 查找元素 .find() .count() 
    // find可以理解为查找具体元素,返回元素的位置结果
    // count可以理解为查找具体元素是否在数据结构中,返回的结果为0/1
    cout << "--------------- find element ---------------" << endl;
    if((example.find("www")) != example.end()){
        cout << "www in unordered_set exampe" << endl;; 
    }
    else{
        cout << "www not in unordered_set example" << endl;
    }

    cout << " --- --- ---" << endl;
    if((example.count("www")) != 0){
        cout << "www in unordered_set exampe" << endl;; 
    }
    else{
        cout << "www not in unordered_set example" << endl;
    }
    
    // unordered_set 的常用信息
    // .size() .max_size() .empty()
    cout << "--------------- basic information ---------------" << endl;
    cout << "example size: " << example.size() << endl;
    cout << "example max_size: " << example.max_size() << endl;
    cout << "example empty or not: " << example.empty() << endl;


    // 删除 unordered_set 中的元素 .clear() .erase()
    // .clear() 全部清除
    // .erase() 清楚指定元素
    cout << "--------------- delete element ---------------" << endl;
    example.erase("www");
    for (auto element : example){
        cout << element << " " << endl;
    }
    unordered_set<string> delete_example = example;
    delete_example.clear();
    cout << "delete_example is empty: " << delete_example.empty() << endl;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值