C++ STL中unordered_multiset的key_eq()函数
介绍
unordered_multiset
是C++标准模板库(STL)中的一个容器,在它的内部实现中使用了哈希表来存储元素,所以它可以快速的插入、删除和查询元素,平均时间复杂度为O(1)。unordered_multiset
与unordered_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_hash
和my_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
容器,在实际工程中发挥更多的作用。