已经广泛建立的类矢量容器有哪些变体?我必须自己写吗?
What variations of vector-like containers already widely established? Do I have to write my own?
在我的程序中,我经常需要一个拥有的类似数组的容器 - 即用于在内存中连续存储的数据,但是向量太灵活而且实用性或效率低于它应有的水平。
要求在一个或多个方面与 std::vector
不同,例如:
- 元素只能在末尾插入,不能移动其他元素
- 构建后/编译后不能更改容量
- 构建后/编译后大小无法更改
- 存储是 class 固有的,不涉及分配器
- 像
std::vector<bool>
这样的单一类型没有奇怪的特殊外壳
- 引用and/or 迭代器不会在插入时失效[=31=]
- 等等
如有必要,我会自己实现这样一个容器,但它可能已经存在于标准库或像 Boost 这样的流行库中。
问题是,它可能很难找到,也许它有一个您意想不到的奇特名字。那么,上述参数 space 中存在哪些类似矢量的容器?
即使现有容器无法满足我的要求,参考列表也会有所帮助:如果我最终实现了一个新容器,我可以采用适当的名称并避免混淆名称。
以下是我所知道的:
- 传统a.k.a。普通 a.k.a。 C数组
vector
unique_ptr
带有数组类型模板参数
array
valarray
dynarray
static_vector
(see also here)
small_vector
stable_vector
还有“可变长度数组”和“具有运行时边界的数组”,不存在于C++中;前者存在于 C 中。另请参阅 this question and 关于这些非 C++ 容器。
让我们比较一下所有这些的特点。如果您想要的容器与以下行之一不完全匹配,您需要实现自己的容器并为其选择一个名称。
Criterion
C array
array
vector
unique_ptr
valarray
dynarray
static_vector
small_vector
stable_vector
Origin/library
language
std
std
std
std
discarded std
Boost
Boost
Boost
Type parameters
T,N
T,N
T,A
T
T
T
T,C,O
T,N,A,O
T,A
Capacity fix time
Compile
Compile
Never
(Construct)
Never
Construct
Compile
Never
Never
Size fix time
Compile
Compile
Never
N/A
Never
Never
Construct
Never
Never
Size = capacity always?
✔
✔
✕
N/A
✕
✔
✕
✕
✕
Storage typically on
Stack
Stack
Heap
Heap
Heap
Heap
Stack
Stack/Heap
Heap
Stable iterators?
N/A
N/A
✕
N/A
N/A
N/A
(✔)
✕
✔
Constraint on element type
✕
✕
✕
✕
✔
✕
✕
✕
✕
模板参数图例:
- A 用于分配器
- 元素类型为 T
- N 表示元素数量的大小
- C 表示元素数量的容量
- O 选项
最后,一个有趣但不太流行的类似矢量的容器是 "veque",或 deque-vector 混合物。
在我的程序中,我经常需要一个拥有的类似数组的容器 - 即用于在内存中连续存储的数据,但是向量太灵活而且实用性或效率低于它应有的水平。
要求在一个或多个方面与 std::vector
不同,例如:
- 元素只能在末尾插入,不能移动其他元素
- 构建后/编译后不能更改容量
- 构建后/编译后大小无法更改
- 存储是 class 固有的,不涉及分配器
- 像
std::vector<bool>
这样的单一类型没有奇怪的特殊外壳
- 引用and/or 迭代器不会在插入时失效[=31=]
- 等等
如有必要,我会自己实现这样一个容器,但它可能已经存在于标准库或像 Boost 这样的流行库中。
问题是,它可能很难找到,也许它有一个您意想不到的奇特名字。那么,上述参数 space 中存在哪些类似矢量的容器?
即使现有容器无法满足我的要求,参考列表也会有所帮助:如果我最终实现了一个新容器,我可以采用适当的名称并避免混淆名称。
以下是我所知道的:
- 传统a.k.a。普通 a.k.a。 C数组
vector
unique_ptr
带有数组类型模板参数array
valarray
dynarray
static_vector
(see also here)small_vector
stable_vector
还有“可变长度数组”和“具有运行时边界的数组”,不存在于C++中;前者存在于 C 中。另请参阅 this question and
让我们比较一下所有这些的特点。如果您想要的容器与以下行之一不完全匹配,您需要实现自己的容器并为其选择一个名称。
Criterion | C array | array | vector | unique_ptr | valarray | dynarray | static_vector | small_vector | stable_vector |
---|---|---|---|---|---|---|---|---|---|
Origin/library | language | std | std | std | std | discarded std | Boost | Boost | Boost |
Type parameters | T,N | T,N | T,A | T | T | T | T,C,O | T,N,A,O | T,A |
Capacity fix time | Compile | Compile | Never | (Construct) | Never | Construct | Compile | Never | Never |
Size fix time | Compile | Compile | Never | N/A | Never | Never | Construct | Never | Never |
Size = capacity always? | ✔ | ✔ | ✕ | N/A | ✕ | ✔ | ✕ | ✕ | ✕ |
Storage typically on | Stack | Stack | Heap | Heap | Heap | Heap | Stack | Stack/Heap | Heap |
Stable iterators? | N/A | N/A | ✕ | N/A | N/A | N/A | (✔) | ✕ | ✔ |
Constraint on element type | ✕ | ✕ | ✕ | ✕ | ✔ | ✕ | ✕ | ✕ | ✕ |
模板参数图例:
- A 用于分配器
- 元素类型为 T
- N 表示元素数量的大小
- C 表示元素数量的容量
- O 选项
最后,一个有趣但不太流行的类似矢量的容器是 "veque",或 deque-vector 混合物。