已经广泛存在的类似载体的容器有哪些变体?我必须写我自己的书吗?
在我的程序中,我经常需要拥有一个像数组一样的容器--即用于连续存储在内存中的数据,但向量太灵活了,没有它应有的实用或效率。
需求与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",即双列向量汞合金。
相关文章