【问题标题】:how to read c++ iso standard? i mean the way如何阅读 c++ iso 标准?我的意思是方式
【发布时间】:2021-10-31 16:34:29
【问题描述】:

我现在正在阅读 n4860,对此我有些好奇。

我不知道怎么解释,所以我只是举个例子。

现在我正在寻找“unordered_set”并且草稿说

template<class Key,
    class Hash = hash<Key>,
    class Pred = equal_to<Key>,
    class Allocator = allocator<Key>>
class unordered_set;

我推断,当我制作自定义 Key 类时,我应该制作 hash、equal_to、allocator 类并将其填充到容器中正常工作。

但我找不到应该在课程中填写的内容。

例如,如果我创建自定义 Key 类,我必须使用 operator(const Key& key) 方法创建 Hash 类,并使用 operator(const Key& key1, const Key& key2) 方法创建 Pred 类。

还有一个例子,带有 operator(const Key& key) 的 Hash 类应该返回 size_t 或者可能是 unsigned long int(?) 而不是字符串。

我可以通过网络搜索和编译器错误消息找到该信息,但在草稿中找不到。

draft 没有类似的信息吗?还是因为我不知道如何阅读而错过了这些信息?

【问题讨论】:

标签: c++ grammar iso unordered-set


【解决方案1】:

std::unordered_map 的要求列在 C++20 草案的 22.2.7 部分。 Hash 的要求在 22.2.7.1.3 中表述为:

每个无序关联容器由 Key 参数化,由满足 Cpp17Hash 要求 ([hash.requirements]) 并充当 Key 类型参数值的哈希函数的函数对象类型 Hash 以及由二进制谓词 Pred 参数化对 Key 类型的值产生等价关系。 此外,unordered_map 和 unordered_multimap 将任意映射类型 T 与 Key 相关联。

[hash.requirements] 位于本标准的16.4.4.5 部分。

预置要求在22.2.7.1.5:

如果容器的键相等谓词 pred(k1, k2) 有效并且在传递这些值时返回 true,则认为两个值 k1 和 k2 是等效的。 如果 k1 和 k2 相等,则容器的散列函数应为两者返回相同的值。


一般来说,在标准中查找不同的需求是不可行的(除非您正在处理基于标准的编译器或资源,例如 cppreference)。这并不是真正的意思,因为它必须是一份考虑到所有可能性的法律文件。我建议改用 cppreference 。从std::unordered_map 页面我们可以看到它必须满足UnorderedAssociativeContainer 要求,这将我们引导到关于Hash 要求和BinaryPredicate 要求的页面。

【讨论】:

  • 现在我看到 cppreference 看起来比 iso 文件更容易。谢谢!
猜你喜欢
  • 2013-06-18
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多