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

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

C++标准库中,unordered_set是一个集合容器,它是通过哈希表实现的。在unordered_set中,所有元素都是唯一的,并且按照哈希值排列。如果您希望自定义哈希函数和比较函数,就需要使用unordered_set提供的key_eq()函数。

什么是key_eq()函数?

std::unordered_setkey_eq函数是用来判定两个元素是否相等的自定义比较函数。 它接受两个参数:k1k2,如果这两个参数相等,那么返回true,否则返回false

template <class Key, class Hash = std::hash<Key>, class Pred = std::equal_to<Key>, class Alloc = std::allocator<Key>>
class unordered_set {
public:
    //...
    typedef Pred key_equal;
    //...
    bool key_eq()(const key_type& k1, const key_type& k2) const;
    //...
};

在默认情况下,key_eq()函数就是使用元素的operator==()运算符判断元素是否相等。但是,如果您需要自定义元素类型的比较方式,那么你就需要实现一个自定义的key_equal函数来代替operator==()

如何自定义key_eq()函数?

您可以通过以下两种方式自定义key_eq()函数:

  1. 自定义函数对象类型。
struct MyKeyEqual {
    bool operator()(const int& key1, const int& key2) const {
        return (key1 % 10) == (key2 % 10);
    }
};
  1. 使用C++标准库中提供的函数对象类型。
using MyEqual = std::equal_to<int>;

std::unordered_set<int, std::hash<int>, MyEqual> mySet;

其中,std::equal_to是C++标准库中定义的一个函数对象类型,它可以被用于存储任何数据类型,因为它使用的是operator==()运算符来比较数据。

示例

这里提供一个使用自定义比较函数的示例。

#include <iostream>
#include <unordered_set>
#include <string>

struct MyKeyEqual {
    bool operator()(const std::string& key1, const std::string& key2) const {
        return (key1.size() == key2.size());
    }
};

int main()
{
    std::unordered_set<std::string, std::hash<std::string>, MyKeyEqual> mySet({"this", "is", "a", "test"});

    std::cout << "mySet contains:";
    for (const auto& x: mySet)
      std::cout << " [" << x << "]";
    std::cout << std::endl;

    return 0;
}

输出结果为:

mySet contains: [test] [is] [a]

在这个示例中,自定义的MyKeyEqual函数只比较两个字符串的长度是否相等,因此,只有长度相等的字符串才会被插入到mySet中。

结论

C++ STL中,unordered_set是一个广泛使用的集合容器,它是通过哈希表实现的。如果您需要自定义集合元素类型的比较方式,可以使用key_eq()函数来自定义比较函数。key_eq()函数的作用是用来判定两个元素是否相等。通过实现自己的比较函数来代替默认的operator==()运算符可以实现自定义元素类型的比较方式。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程