容器
目录
简介
标准 C++ 库已经提供了广泛的容器和适配器 (adaptors)。
要做得比它更好非常困难(尽管做得更糟很容易,正如网上许多示例所展示的那样)。
EnTT 绝不试图取代标准库提供的内容。恰恰相反,标准容器的使用已经非常广泛。
然而,该库还试图通过提供一些最初为内部使用而开发的容器和适配器,来填补特性和功能上的空白。
库的这一部分可能会随着时间的推移而不断扩大。然而,目前它还相当小,主要用于满足一些内部需求。
与往常一样,对于提供的所有容器和适配器,均保证了完整的测试覆盖率和长期的稳定性。
容器
Dense map
EnTT 中提供的 dense map 是一种哈希映射 (hash map),旨在返回元素的紧凑数组 (packed array),从而减少迭代期间内存中的跳转次数。
其实现基于 稀疏集 (sparse sets),每个桶 (bucket) 由紧凑数组本身内的隐式列表标识。
其接口与标准库中的对应物(即 std::unordered_map 类)非常接近。
然而,dense map 返回的局部和非局部迭代器都属于输入迭代器 (input iterator) 类别,尽管它们分别建模了 前向迭代器 (forward iterator) 类型和 随机访问迭代器 (random access iterator) 类型的概念。
这是因为它们返回的是一对引用 (pair of references),而不是对 pair 的引用。换句话说,dense map 返回所谓的 代理迭代器 (proxy iterator),其值类型 (value type) 为:
- 对于非 const 迭代器类型:
std::pair<const Key &, Type &>。 - 对于 const 迭代器类型:
std::pair<const Key &, const Type &>。
这与任何标准库 map 返回的内容大相径庭,在寻找无缝替代品 (drop-in replacement) 时应将其考虑在内。
Dense set
EnTT 中提供的 dense set 是一种哈希集合 (hash set),旨在返回元素的紧凑数组,从而减少迭代期间内存中的跳转次数。
其实现基于 稀疏集,每个桶由紧凑数组本身内的隐式列表标识。
其接口在所有方面都与标准库中的对应物(即 std::unordered_set 类)相似。
然而,这种类型的 set 还支持反向迭代 (reverse iteration),因此提供了实现此目的所需的所有函数(例如 rbegin 和 rend)。
适配器
Table
basic_table 类是一个容器适配器 (container adaptor),它同时管理多个顺序容器 (sequential containers),将它们视为同一张表的不同列。
table 别名允许用户仅提供要处理的类型,并使用 std::vector 作为默认的顺序容器。
只提供了一小部分函数,尽管它们与 std::vector 类提供的 API 非常接近。
内部实现有意由容器组成的 tuple 支持,而不是由 tuple 组成的容器。其目的是允许高效地访问单列,而不仅仅是访问表的整个数据集。
当访问一行时,所有数据都以 tuple 的形式返回,其中包含对行本身元素的(可能为 const 的)引用。
同样,当迭代表时,会为每一行返回对表元素引用的 tuple。