已经广泛存在的类似载体的容器有哪些变体?我必须写我自己的书吗?

2022-08-23 00:00:00 arrays c++ stdvector boost stdarray

在我的程序中,我经常需要拥有一个像数组一样的容器--即用于连续存储在内存中的数据,但向量太灵活了,没有它应有的实用或效率。

需求与std::vector在一个或多个方面不同,例如:

  • 只能在结尾处插入元素,不能移动其他元素
  • 构建/编译后不能更改容量
  • 构造/编译后不能更改大小
  • 存储是类固有的,不涉及分配器
  • 对于单个类型没有奇怪的特殊大小写,如std::vector<bool>
  • 引用和/或迭代器在插入时不会失效

如有必要,我将自己实现这样一个容器,但它很可能已经存在于标准库或Boost等流行的库中。

问题是,它可能很难找到,也许它有一个你意想不到的奇特名字。那么,上述参数空间中存在哪些类向量的容器呢?

即使现有容器不能满足我的要求,引用列表也会有所帮助:如果我最终实现了一个新容器,我可以采用适当的名称并避免混淆名称。


解决方案

以下是我所知道的:

  • 传统的又名。平淡,也就是。C数组
  • vector
  • unique_ptr使用数组类型模板参数
  • array
  • valarray
  • dynarray
  • static_vector(另见here)
  • small_vector
  • stable_vector

还有";可变长度数组和";数组,它们不存在于C++中;前者存在于C中。另请参阅this question和this answer有关这些非C++容器的信息。

让我们比较一下所有这些组件的功能。如果您需要的容器与下面的某一行不完全匹配,则需要实现您自己的容器并为其选择一个名称。

标准 C数组 数组 向量 UNIQUE_PTR valarray 达纳雷 静态向量 小向量 稳定向量
来源/库 语言 标准 标准 标准 标准 丢弃标准 Boost Boost Boost
类型参数 T,N T,N T、A T T T T、C、O T、N、A、O T、A
定容时间 编译 编译 从不 (构造) 从不 构造 编译 从不 从不
大小固定时间 编译 编译 从不 不适用 从不 从不 构造 从不 从不
大小=容量始终? ? ? ? 不适用 ? ? ? ? ?
存储通常启用 堆栈 堆栈 堆栈 堆栈/堆
稳定迭代器? 不适用 不适用 ? 不适用 不适用 不适用 (?) ? ?
元素类型限制 ? ? ? ? ? ? ? ? ?

模板参数图例:

  • A表示分配器
  • 元素类型为T
  • N表示元素数量中的大小
  • C表示元素数量中的容量
  • O表示选项

最后,一个有趣但不太受欢迎的类似向量的容器是"veque",即双列向量汞合金。

相关文章