C++ STL中的unordered_multimap key_eq() 函数
在处理数据时,关键字是一个很重要的概念。对于unordered_multimap,它是一个基于哈希表实现的C++ STL容器,保存的是一个键值对集合,其中key是唯一的标识符。key_eq()是unordered_multimap的一个重要函数,它主要用于比较键值是否相等。
unordered_multimap的常用函数
先了解一下unordered_multimap的常用函数:
- insert(key, value):将键值对插入容器中,并返回一个迭代器指向它
#include <unordered_map>
using namespace std;
int main() {
unordered_multimap<int, int> umap;
umap.insert({1, 10});
umap.insert({1, 20});
umap.insert({2, 30});
return 0;
}
- find(key):在容器中查找某个键为key的元素,并返回一个迭代器指向它,如果未找到,则返回unordered_map::end()
#include <unordered_map>
#include <iostream>
using namespace std;
int main(){
unordered_multimap<int, int> umap;
umap.insert({1, 10});
umap.insert({1, 20});
umap.insert({2, 30});
auto it = umap.find(1);
if(it != umap.end()){
cout << "key = " << it->first << ", value = " << it->second << endl;
}
return 0;
}
- erase(key):从容器中删除键值为key的元素
#include <unordered_map>
using namespace std;
int main(){
unordered_multimap<int, int> umap;
umap.insert({1, 10});
umap.insert({1, 20});
umap.insert({2, 30});
umap.erase(1);
return 0;
}
key_eq()函数
unordered_multimap采用哈希表存储元素,同时在同一个桶中可能会出现多个元素,因此需要借助键值对中的key来判断元素是否相等。因此,key_eq()函数就是用来判断键值对中的key是否相等。
- key_eq()的定义
class unordered_multimap {
...
class key_equal {
public:
bool operator() (const key_type& k1, const key_type& k2) const;
};
...
};
可以看到,key_eq()定义了一个名为key_equal的类,它只有一个名为operator()的成员函数,而这个成员函数就是用来判断键值对中的key是否相等。我们必须给定一个键值对中的key类型,这个类型可以在unordered_multimap的定义时指定。
- 自定义key_eq()函数
unordered_multimap提供了一个默认的key_eq()函数,它是std::equal_to
如果需要自定义键值对中的key相等的判断方式,可以通过自定义一个结构体来实现:
struct hash_eq{
bool operator()(const string& s1, const string& s2) const{
return s1.size() == s2.size() && s1[0] == s2[0];
}
};
unordered_multimap<string, int, hash<string>, hash_eq> umap;
由此可见,在自定义unordered_multimap的容器中的元素相等时,需要重载operator(),并在这个函数内部比较键值对中的key是否相等。
总结
unordered_multimap具有存储键值对集合的特点,key_eq()是用于比较键值对中的key是否相等的函数。自定义key_eq()函数时需要重载operator(),并在这个函数内部比较键值对中的key是否相等。应用unordered_multimap可以简化对键值对集合的操作,避免了手动构造哈希表的麻烦的步骤,提高了代码开发的效率,是一个很好用的容器。同时,在使用时要注意合理选择不同的哈希函数、键值对类型及自定义key_eq()函数,以便更好的满足实际应用需求。