Jens Asked:2020-08-23 03:01:49 +0000 UTC2020-08-23 03:01:49 +0000 UTC 2020-08-23 03:01:49 +0000 UTC 在一组无序的自定义类实例中进行搜索优化 772 让我们考虑一个存储自定义类实例的无序集,而散列仅在此类的一个字段上执行。为了找到所需的元素,我们使用 find 算法。但是,该算法还需要此类的完整实例,而不仅仅是单个可散列字段。问题:在无序集合中搜索并仅使用一个字段时,是否有可能以某种方式摆脱类的此服务实例的创建? c++ 1 个回答 Voted Best Answer AnT stands with Russia 2020-08-23T03:11:56Z2020-08-23T03:11:56Z 这个特性只会通过所谓的透明(transparent)散列器和比较器的功能在 C++20 中正式出现。也就是说,从 C++ 20 开始,方法的模板版本std::unordered_set将出现在接受任何类型作为输入时。(假设您将在那里传递键值。)find 对于其他类型的容器(例如std::set),这种基于透明比较器的搜索的可能性已经出现在 C++14 中 #include <set> #include <iostream> using Item = std::pair<int, int>; struct Comparator { bool operator ()(const Item &lhs, const Item &rhs) const { return lhs < rhs; } using is_transparent = void; bool operator ()(const Item &lhs, int rhs) const { return lhs.first < rhs; } bool operator ()(int lhs, const Item &rhs) const { return lhs < rhs.first; } }; int main() { std::set<Item, Comparator> s = { { 1, 100 }, { 2, 200 }, { 3, 300 } }; auto it = s.find(2); std::cout << it->second << std::endl; } 但是对于基于散列的容器,这个功能被延迟到了 C++20。
这个特性只会通过所谓的透明(transparent)散列器和比较器的功能在 C++20 中正式出现。也就是说,从 C++ 20 开始,方法的模板版本
std::unordered_set将出现在接受任何类型作为输入时。(假设您将在那里传递键值。)find对于其他类型的容器(例如
std::set),这种基于透明比较器的搜索的可能性已经出现在 C++14 中但是对于基于散列的容器,这个功能被延迟到了 C++20。