欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

unordered_set

时间:2024-05-11 14:36 作者:admin 点击:
在C++标准模板库(STL)中, unordered_set 是一种基于哈希表实现的容器,它存储的元素是唯一的,并且提供近常数时间的查找、插入和删除操作。与 set 不同, unordered_set 中的元素不按顺

在C++标准模板库(STL)中,unordered_set 是一种基于哈希表实现的容器,它存储的元素是唯一的,并且提供近常数时间的查找、插入和删除操作。与 set 不同,unordered_set 中的元素不按顺序排列,而是通过哈希函数和冲突解决策略(通常是链地址法或开放寻址法)来存储。

unordered_set 定义在 <unordered_set> 头文件中。

主要特点

  • 唯一性:容器中的元素值是唯一的,不允许有重复的元素。
  • 无序性:元素不按特定顺序排列,是随机顺序。
  • 快速操作:提供平均常数时间的查找、插入和删除操作。
  • 哈希表:内部使用哈希表实现,需要提供元素的哈希值和相等比较。

主要操作

  • 构造:可以构造一个空的 unordered_set 或者使用一系列元素初始化。
  • 插入insert 一个新元素。如果 unordered_set 中已存在相同的元素,则不会插入。
  • 查找find 查找一个元素。
  • 计数count 一个元素的个数,由于 unordered_set 中元素唯一,计数结果永远是1或0。
  • 删除
  • 大小size 返回容器中元素的数量。
  • 范围beginend 提供迭代器范围,允许遍历容器中的元素。

使用 std::unordered_set 的步骤

  1. 包含头文件:使用 unordered_set 之前需要包含 <unordered_set> 头文件。
  2. 声明 unordered_set 实例:指定元素类型来声明 std::unordered_set 的实例。
  3. 初始化:可以默认构造一个空的 std::unordered_set,或者使用花括号 {} 初始化。
  4. 执行操作:使用 insert、find、erase 等方法操作无序集合。

示例代码

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> myUnorderedSet;

    // 向无序集合中插入元素
    myUnorderedSet.insert(10);
    myUnorderedSet.insert(5);
    myUnorderedSet.insert(10); // 不会插入重复元素

    // 查找元素
    auto it = myUnorderedSet.find(5);
    if (it != myUnorderedSet.end()) {
        std::cout << "Element found: " << *it << std::endl;
    } else {
        std::cout << "Element not found." << std::endl;
    }

    // 遍历无序集合并输出所有元素
    for (int num : myUnorderedSet) {
        std::cout << num << ' ';
    }
    std::cout << std::endl;

    // 删除元素
    myUnorderedSet.erase(5);

    // 再次遍历无序集合并输出所有元素
    for (int num : myUnorderedSet) {
        std::cout << num << ' ';
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,我们创建了一个 std::unordered_set 的实例,并向其中插入了一些整数。然后,我们尝试插入一个已经存在的元素,unordered_set 会忽略这个操作。接着,我们使用 find 方法查找一个元素,并遍历无序集合输出所有元素。然后,我们使用 erase 方法删除一个元素,并再次输出无序集合中的元素。

注意事项

  • std::unordered_set 的迭代器顺序并不反映元素的实际存储顺序,也不保证顺序的一致性。
  • 由于 std::unordered_set 是基于哈希表实现的,所以在使用 unordered_set 时需要保证元素类型具有合理的哈希函数和相等比较函数。
  • 在多线程环境中使用 std::unordered_set 时,需要注意线程安全问题,因为 std::unordered_set 并不是线程安全的。
  • std::unordered_set 的性能可能受到哈希函数质量和负载因子(容器大小与哈希表大小的比率)的影响。

std::unordered_set 是实现无序集合的便捷方式,适用于需要快速查找且不关心元素顺序的场景。


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%