C++STL 中的 unordered_multiset find() 函数

C++STL 中的 unordered_multiset find() 函数

什么是 unordered_multiset?

C++11 引入了 STL 的拓展 — unordered_multiset。unordered_multiset 是一个 hash table 容器,它与 multiset 的不同之处在于 unordered_multiset 不关心元素的顺序,而是以 hash 的方式来组织元素的存储。

以 unordered_multiset 为例,它的插入、查找和删除操作的时间复杂度都为 O(1),如下所示:

#include <iostream>
#include <unordered_set>

using namespace std;

int main() {
    unordered_multiset<int> myset;

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

    // 查找元素
    auto it = myset.find(20);
    if (it != myset.end()) {
        cout << *it << endl; // 输出 20
    }

    // 删除元素
    myset.erase(10);

    // 打印所有元素
    for (auto x : myset) {
        cout << x << endl;
    }

    return 0;
}

在这个例子中,我们创建了一个 unordered_multiset,插入了 10、20 和 30 三个元素。然后,我们通过 find() 函数查找 20 这个元素是否存在于容器中,如果存在,就输出它的值(即 20)。接着,我们用 erase() 函数删除了元素 10,最后使用 for 循环打印出所有剩余的元素(即 20 和 30)。

需要注意的是,unordered_multiset 和 multiset 一样,允许元素的重复出现。但是,unordered_multiset 的元素并不按照插入的顺序存储,而是以 hash 的方式组织。

unordered_multiset find() 函数的用法

在上面的代码中,我们使用了 unordered_multiset 的 find() 函数来查找指定的元素。find() 函数的用法非常简单,只需要传入要查找的元素的值即可:

auto it = myset.find(value);

其中,value 是要查找的元素的值。如果元素不存在于 unordered_multiset 中,find() 函数会返回一个指向 myset.end() 的迭代器,表示查找失败。反之,则返回指向查找到的元素的迭代器。

需要注意的是,find() 函数的返回值是一个迭代器(iterator),它是 C++ STL 中另一个非常常用的概念。迭代器用来遍历容器中的元素,可以像指针一样访问容器中的元素,也可以进行++、–运算,迭代器的类型和容器类型相关。在以上的示例代码中,我们使用 auto 关键字让编译器自动推导迭代器的类型。

unordered_multiset find() 函数的时间复杂度

unordered_multiset 的查找操作由于使用了 hash 表,因此查找的时间复杂度是 O(1),比较高效。但需要注意的是,在 hash 表冲突比较多的情况下,查找的时间复杂度可能会变成 O(n),比如元素的 hash 值都相同。

unordered_multiset find() 函数的内部实现

C++ STL 中的 unordered_multiset 实现是基于 hash 表的,因此 unordered_multiset find() 函数的内部实现也是基于 hash 表的。具体来说,当我们调用 unordered_multiset 的 find() 函数时,它会首先计算被查找元素的 key 的 hash 值,然后根据这个 hash 值找到对应的桶(bucket)。在桶内,unordered_multiset 会遍历链表,查找是否有等于被查找元素的 key 的元素,找到则返回对应的迭代器,否则返回指向myset.end() 的迭代器,表示查找失败。

下面是 unordered_multiset find() 函数的简单实现,以便更好地理解它的内部实现:

iterator find(const key_type& key) {
    // 计算 key 的 hash 值
    size_type bucket_index = hash_function()(key) % bucket_count();

    // 在对应的桶中查找元素
    for (auto it = buckets_[bucket_index].begin(); it != buckets_[bucket_index].end(); ++it) {
        if (key_equal()(*it, key)) {
            return iterator(*this, bucket_index, it);
        }
    }

    // 查找失败,返回指向 end() 的迭代器
    return end();
}

在这个实现中,我们首先通过 hash_function() 计算被查找元素的 key 的 hash 值,然后根据这个 hash 值找到对应的桶(bucket_index)。接着,在桶内遍历链表,查找是否有等于被查找元素的 key 的元素。如果找到了,就返回对应的迭代器,否则返回指向 end() 的迭代器,表示查找失败。

总结

unordered_multiset find() 函数是 unordered_multiset 容器的查找函数之一,用于查找容器中是否存在指定的元素。它的时间复杂度是 O(1),非常高效。在内部实现上,它使用了 hash 表来查找元素,这也是 unordered_multiset 的重要特性之一。

虽然 unordered_multiset 的查找操作非常高效,但是它的删除操作相对较慢(时间复杂度为 O(n))。因此,在使用 unordered_multiset 时,需要根据实际情况进行选择。如果需要频繁的删除操作,可以考虑使用 multiset 容器。如果需要高效的查找操作,则可以选择 unordered_multiset。

当使用 unordered_multiset find() 函数时,我们需要注意返回值是一个迭代器,可以通过自增、自减操作来遍历 unordered_multiset 容器中的元素。同时,我们也需要了解 unordered_multiset 容器的内部实现,以便更好地理解 unordered_multiset find() 函数的工作原理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程