C++ STL中的unordered_set key_eq()函数
在C++标准库中,unordered_set
是一个集合容器,它是通过哈希表实现的。在unordered_set
中,所有元素都是唯一的,并且按照哈希值排列。如果您希望自定义哈希函数和比较函数,就需要使用unordered_set
提供的key_eq()
函数。
什么是key_eq()函数?
std::unordered_set
的key_eq
函数是用来判定两个元素是否相等的自定义比较函数。 它接受两个参数:k1
和k2
,如果这两个参数相等,那么返回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()
函数:
- 自定义函数对象类型。
struct MyKeyEqual {
bool operator()(const int& key1, const int& key2) const {
return (key1 % 10) == (key2 % 10);
}
};
- 使用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==()
运算符可以实现自定义元素类型的比较方式。