📅  最后修改于: 2023-12-03 15:29:51.206000             🧑  作者: Mango
在C++ STL中的unordered_set中,key_eq()函数是一个用于比较两个元素的函数,用于判断两个元素是否相等。unordered_set是C++ STL中的哈希表,用于存储键/值对。在哈希表中,元素的顺序是无序的,但可通过键值快速定位元素。
key_eq()函数的语法如下:
class unordered_set {
typedef function<bool (const key_type&, const key_type&)> key_equal;
key_equal key_eq() const;
};
key_eq()函数返回一个用于比较两个键是否相等的函数对象。此函数对象应返回true如果两个键相等,否则返回false。默认情况下,此函数对象使用std::equal_to
在unordered_set中,重要的是通过键值快速定位元素。为此,必须确保比较两个键是否相等是准确的。如果在两个键相等时返回false,则会导致unordered_set无法正确地定位元素。
例如,如果unordered_set中有两个键"abc"和"Abc",则默认情况下,unordered_set将认为这是两个不同的键。然而,如果您希望将大小写视为相等,则可以通过重写key_eq()函数来实现。
#include <unordered_set>
#include <iostream>
#include <string>
using namespace std;
class ci_char_traits : public char_traits<char> {
public:
static bool eq(char c1, char c2) {
return toupper(c1) == toupper(c2);
}
static bool ne(char c1, char c2) {
return toupper(c1) != toupper(c2);
}
static bool lt(char c1, char c2) {
return toupper(c1) < toupper(c2);
}
static int compare(const char* s1, const char* s2, size_t n) {
return _strnicmp(s1, s2, n);
}
static const char* find(const char* s, int n, char a) {
while (n-- > 0 && toupper(*s) != toupper(a)) {
++s;
}
return (n >= 0) ? s : nullptr;
}
};
typedef basic_string<char, ci_char_traits> ci_string;
class ci_hash {
public:
size_t operator()(const ci_string& str) const {
return std::hash<std::string>()(str.c_str());
}
};
class ci_key_equal {
public:
bool operator()(const ci_string& str1, const ci_string& str2) const {
return str1.size() == str2.size() &&
equal(str1.begin(), str1.end(), str2.begin(), ci_char_traits::eq);
}
};
int main() {
unordered_set<ci_string, ci_hash, ci_key_equal> myset;
myset.insert("abc");
myset.insert("Abc");
myset.insert("Def");
cout << "myset contains:";
for (const ci_string& x : myset) {
cout << ' ' << x;
}
cout << '\n';
return 0;
}
上面的例子中,将unordered_set的键类型设置为ci_string。ci_string是一个基于std::basic_string的自定义字符串类型,它使用ci_char_traits类实现了不区分大小写的字符串比较。ci_hash类是用于计算哈希值的类,而ci_key_equal类是用于比较键是否相等的类。在ci_key_equal类中,重写了操作符(),实现了不区分大小写的字符串比较。
unordered_set是C++ STL中的哈希表,用于存储键/值对。key_eq()函数是一个用于比较两个键是否相等的函数,用于确保通过键值快速定位元素。需要注意的是,如果在两个键相等时返回false,则会导致unordered_set无法正确地定位元素。