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

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

介绍

unordered_multisetC++标准模板库(STL)中的一个容器,在它的内部实现中使用了哈希表来存储元素,所以它可以快速的插入、删除和查询元素,平均时间复杂度为O(1)。unordered_multisetunordered_set的区别是可以插入重复的元素。unordered_multiset的函数中有一个key_eq()函数,该函数实现了判断两个元素的键是否相等,关于它的用法我们将在下文中进行详细讲解。

unordered_multiset简介

首先让我们来简单的介绍一下unordered_multiset。它是一种无序的关联容器,其中的元素被存储为一个哈希表,哈希表中的每个元素都包含着一个键值对。 unordered_multiset提供了以下几个重要的函数:

  • insert():插入元素。
  • erase():删除元素。
  • find():查找元素。
  • clear():清空容器。
  • key_eq():比较两个键是否相等。
  • value_eq():比较两个值是否相等。

下面我们来看一个简单的unordered_multiset例子:

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_multiset<int> ums;

    // 在unordered_multiset中插入元素
    ums.insert(1);
    ums.insert(2);
    ums.insert(3);

    // 打印unordered_multiset中所有元素
    for (auto i : ums) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

key_eq()函数介绍

key_eq()函数是unordered_multiset的成员函数之一,其原型为:

key_equal key_eq() const;

其中key_equal是一个模板类型参数。该函数返回当前哈希表中的键的比较器对象。在默认情况下,该比较器对象是std::equal_to<Key>

typedef std::equal_to<Key> key_equal;

该比较器对象也可以被用户自定义。

使用key_eq()函数

如果我们想要使用自定义的比较器对象,我们需要在创建unordered_multiset对象时指定。下面是一个示例:

#include <iostream>
#include <unordered_set>

struct my_hash {
    size_t operator()(const int& k) const {
        return k % 10;
    }
};

struct my_equal {
    bool operator()(const int& x, const int& y) const {
        return (x % 10) == (y % 10);
    }
};

int main()
{
    std::unordered_multiset<int, my_hash, my_equal> ums;

    // 在unordered_multiset中插入元素
    ums.insert(1);
    ums.insert(2);
    ums.insert(3);
    ums.insert(11);
    ums.insert(12);

    // 打印unordered_multiset中所有元素
    for (auto i : ums) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们定义了两个对象my_hashmy_equal,将它们作为模板参数传递给了unordered_multiset,在插入元素时将按照my_hash散列函数进行哈希,通过my_equal比较函数进行判断键的相等性。

内置的比较器对象

unordered_multiset也有自己的默认比较器std::equal_to<T>,该比较器的源码如下:

template<typename T>
struct equal_to {
    bool operator()(const T& x, const T& y) const {
        return x == y;
    }
};

好在这个比较器对象是内置的,我们无需手动定义,在使用时只需要将其作为模板类型参数传入即可。

下面是一个使用内置比较器对象的示例:

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_multiset<std::string> ums;

    // 在unordered_multiset中插入元素
    ums.insert("apple");
    ums.insert("banana");
    ums.insert("orange");
    ums.insert("apple");
    ums.insert("banana");

    // 打印unordered_multiset中所有元素
    for (auto i : ums) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们声明了一个unordered_multiset<std::string>并插入了一些元素,注意到我们并没有手动定义比较器对象,这是因为unordered_multiset默认使用的是std::equal_to<std::string>作为比较器对象,而std::string自身已经实现了==运算符。

总结

本文我们介绍了unordered_multiset容器和它的一个重要成员函数key_eq()key_eq()函数用于比较unordered_multiset中的键是否相等,它的返回值是与unordered_multiset关联的比较器对象。unordered_multiset的默认比较器对象是std::equal_to<T>,而该比较器对象在T类实现了==运算符时可以直接使用。我们还通过示例代码讲解了如何使用自定义的比较器对象。

希望本文能够帮助到大家使用unordered_multiset容器,在实际工程中发挥更多的作用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程