Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

容器

目录

简介

标准 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),因此提供了实现此目的所需的所有函数(例如 rbeginrend)。

适配器

Table

basic_table 类是一个容器适配器 (container adaptor),它同时管理多个顺序容器 (sequential containers),将它们视为同一张表的不同列。
table 别名允许用户仅提供要处理的类型,并使用 std::vector 作为默认的顺序容器。

只提供了一小部分函数,尽管它们与 std::vector 类提供的 API 非常接近。
内部实现有意由容器组成的 tuple 支持,而不是由 tuple 组成的容器。其目的是允许高效地访问单列,而不仅仅是访问表的整个数据集。

当访问一行时,所有数据都以 tuple 的形式返回,其中包含对行本身元素的(可能为 const 的)引用。
同样,当迭代表时,会为每一行返回对表元素引用的 tuple。