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

📅  最后修改于: 2023-12-03 15:29:51.206000             🧑  作者: Mango

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

在C++ STL中的unordered_set中,key_eq()函数是一个用于比较两个元素的函数,用于判断两个元素是否相等。unordered_set是C++ STL中的哈希表,用于存储键/值对。在哈希表中,元素的顺序是无序的,但可通过键值快速定位元素。

key_eq()函数的语法

key_eq()函数的语法如下:

class unordered_set {
    typedef function<bool (const key_type&, const key_type&)> key_equal;
    key_equal key_eq() const;
};
  • key_type:键的类型
  • key_equal:比较两个键是否相等的函数对象类型
key_eq()函数的返回值

key_eq()函数返回一个用于比较两个键是否相等的函数对象。此函数对象应返回true如果两个键相等,否则返回false。默认情况下,此函数对象使用std::equal_to,其中T是unordered_set的键类型。

key_eq()函数的用途

在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无法正确地定位元素。