set和unordered_set的KEY的类型要求

setunordered_set的类型要求

set

  1. 需要支持小于比较,或者显示提供比较的仿函数

unordered_set

  1. 可以转换成整型取模 或者 提供转换成整型的仿函数
  2. 可以支持等于比较 或者 提供等于比较的仿函数

在C++中,std::set和std::unordered_set是两种不同的容器,它们具有不同的实现和特性。对于这两个容器的KEY类型,存在一些不同的要求。

1.std::set:

  • KEY类型需要支持小于比较运算符 <,或者您可以提供自定义的比较函数或函数对象作为可选的模板参数。
  • 默认情况下,std::set会使用std::less作为比较函数对象,它使用小于比较运算符进行排序。
    示例:
#include <set>

struct MyType {
  int value;
};

bool operator<(const MyType& a, const MyType& b) {
  return a.value < b.value;
}

std::set<MyType> mySet;  // 使用自定义的小于比较运算符
  1. std::unordered_set:
  • KEY类型可以通过哈希函数转换为整型,或者您可以提供自定义的哈希函数作为可选的模板参数。

  • KEY类型还需要支持等于比较运算符 ==,或者您可以提供自定义的等于比较函数或函数对象作为可选的模板参数。
    示例:


#include <unordered_set>

struct MyType {
  int value;
};

bool operator==(const MyType& a, const MyType& b) {
  return a.value == b.value;
}

struct MyHash {
  std::size_t operator()(const MyType& key) const {
    return std::hash<int>{}(key.value);
  }
};

std::unordered_set<MyType, MyHash> myUnorderedSet;  // 使用自定义的哈希函数和等于比较运算符

需要注意的是,为了正确使用std::set和std::unordered_set,您需要确保定义了适当的比较运算符(或自定义比较函数/函数对象)和哈希函数(或自定义哈希函数)来处理KEY类型。这样才能在容器中正确地存储和检索元素。