unordered_set总结

1、简介

unordered_set是C++标准库中的一个容器,它可以存储不重复的元素集合。这个容器的特点是内部元素没有特定的顺序,因此查找、插入和删除操作的平均时间复杂度是O(1)。unordered_set是基于哈希表实现的,所以在使用时需要提供一个哈希函数和相等函数。

unordered_set 的内部,数据通常存储在哈希表中。哈希表由桶组成,每个桶存储具有相同哈希值的元素。然而,这些实现细节是在类定义中隐藏的,用户不需要关心这些细节。您可以使用提供的成员函数来操作和查询容器的状态,例如插入、删除、查找元素,以及查询容器的大小、负载因子等。

下面是unordered_set的一些关键特性:

  1. 不重复元素:unordered_set中的每个元素都是唯一的,即不允许有重复的值。

  2. 无序:元素在容器内部不按任何顺序存储。这意味着当你遍历容器时,不能期望元素以特定的顺序出现。

  3. 快速查找、插入和删除:由于基于哈希表实现,unordered_set的查找、插入和删除操作平均时间复杂度为O(1)。然而,在哈希表的负载因子较高时,这些操作的性能可能会降低。

  4. 自定义哈希和相等函数:你可以为unordered_set提供自定义的哈希函数和相等函数,以便适应特定的数据类型和场景。

以下是一个简单的unordered_set使用示例:

#include <iostream>
#include <unordered_set>

int main() {
    // 创建一个整数类型的unordered_set
    std::unordered_set<int> my_set;

    // 插入元素
    my_set.insert(10);
    my_set.insert(20);
    my_set.insert(30);
    my_set.insert(40);

    // 查找元素
    auto search = my_set.find(20);
    if (search != my_set.end()) {
        std::cout << "Found " << *search << '\n';
    } else {
        std::cout << "Not found\n";
    }

    // 删除元素
    my_set.erase(30);

    // 遍历并打印元素
    for (const int& x : my_set) {
        std::cout << x << ' ';
    }

    return 0;
}

2、构造函数

unordered_set 提供了多个构造函数,以便在不同情况下创建和初始化容器。以下是一些常用的 unordered_set 构造函数:

1)默认构造函数:创建一个空的 unordered_set

std::unordered_set<Key> my_set;

2)范围构造函数:根据给定范围内的元素创建一个 unordered_set。范围由两个迭代器(通常为 begin()end())表示。

std::unordered_set<Key> my_set(first_iterator, last_iterator);

3)列表初始化构造函数:使用初始化列表创建一个 unordered_set

std::unordered_set<Key> my_set({key1, key2, key3});

4)复制构造函数:从另一个 unordered_set 创建一个新的 unordered_set,并复制所有元素。

std::unordered_set<Key> my_set(other_set);

5)移动构造函数:从另一个 unordered_set 创建一个新的 unordered_set,并移动所有元素(不复制)。

std::unordered_set<Key> my_set(std::move(other_set));

此外,unordered_set 构造函数还允许您指定自定义哈希函数和键比较函数,以及初始桶数等参数。例如:

std::unordered_set<Key, Hash, KeyEqual> my_set(
    initial_bucket_count,
    custom_hash_function,
    custom_key_equal_function);

这里,Key 是要存储的元素类型,Hash 是哈希函数类型,KeyEqual 是键比较函数类型。initial_bucket_count 是指定初始桶数的参数。custom_hash_functioncustom_key_equal_function 分别是自定义哈希函数和键比较函数的实例。

3、成员函数

unordered_set 提供了一系列成员函数,使您能够执行各种操作,例如插入、删除和查找元素,以及查询容器的状态。以下是 unordered_set 的一些常用成员函数:

begin() 和 end():返回指向容器中第一个元素和最后一个元素之后的位置的迭代器。

size():返回容器中元素的数量。

empty():检查容器是否为空。如果为空,返回 true,否则返回 false。

max_size():返回容器可以容纳的最大元素数量。

insert():将元素插入到容器中。如果元素已经存在,则不会插入。

emplace():构造并插入元素。与 insert() 类似,但可以直接使用构造函数参数,避免额外的复制或移动操作。
erase():从容器中删除指定的元素。
clear():删除容器中的所有元素。

find():查找容器中是否存在具有指定键的元素。如果找到,则返回指向该元素的迭代器;否则,返回指向容器结尾的迭代器。

count():返回具有指定键的元素的数量。对于 unordered_set,结果只能是 0 或 1。

bucket_count():返回容器中的桶数量。

load_factor():返回容器的负载因子。负载因子是元素数量与桶数量的比值。

max_load_factor():返回或设置容器的最大负载因子。当实际负载因子超过最大负载因子时,容器会自动增加桶数量。

rehash():设置容器的桶数量。当桶数量增加时,容器将重新分配其元素,以保持合适的负载因子。

reserve():设置容器的最小桶数量,以便容纳指定数量的元素,而无需重新哈希。

猜你喜欢

转载自blog.csdn.net/2201_75772333/article/details/130611697