如何解决已经广泛建立的类矢量容器有哪些变体?我必须自己写吗?
在我的程序中,我经常需要一个拥有类似数组的容器 - 即用于在内存中连续存储的数据,但 vector 太灵活,实用性或效率低于它应有的水平。
要求在一个或多个方面与 std::vector
不同,例如:
- 元素只能插入到最后,不能移动其他元素
- 构建后/编译后无法更改容量
- 构建后/编译后无法更改大小
- 存储是类固有的,不涉及分配器
- 对于像
std::vector<bool>
这样的单一类型没有奇怪的特殊大小写 - 引用和/或迭代器不会在插入时失效
- 等
如有必要,我会自己实现这样一个容器,但它可能已经存在于标准库或像 Boost 这样流行的库中。
问题是,它可能很难找到,也许它有一个你意想不到的花哨名称。那么,在上述参数空间中存在哪些类向量容器?
即使我的要求在现有容器中没有得到满足,参考列表也会有所帮助:如果我最终实现了一个新容器,我可以采用适当的名称并避免混淆名称。
解决方法
以下是我所知道的:
- 传统的又名普通的又名 C 数组
vector
array
valarray
dynarray
-
static_vector
(另见here) small_vector
stable_vector
还有“可变长度数组”和“具有运行时边界的数组”,它们在 C++ 中不存在;前者存在于 C 中。另请参阅关于这些非 C++ 容器的 this question 和 this answer。
让我们比较一下所有这些的特点。如果您想要的容器与以下任一行不完全匹配,您需要实现自己的容器并为其选择一个名称。
标准 | C 数组 | 数组 | vector | valarray | dynarray | static_vector | small_vector | stable_vector |
---|---|---|---|---|---|---|---|---|
来源/图书馆 | 语言 | std | std | std | 废弃标准 | 提升 | 提升 | 提升 |
类型参数 | T,N | T,A | T | T | T,C,O | T,N,A,A | ||
容量修复时间 | 编译 | 编译 | 从不 | 从不 | 构造 | 编译 | 从不 | 从不 |
大小固定时间... | 编译 | 编译 | 从不 | 从不 | 从不 | 构造 | 编译 | 从不 |
尺寸=容量总是? | ✔ | ✔ | ✕ | ✕ | ✔ | ✕ | ✕ | ✕ |
通常存储在 | 堆栈 | 堆栈 | 堆 | 堆 | 堆 | 堆栈 | 堆栈/堆 | 堆 |
稳定迭代器? | 不适用 | 不适用 | ✕ | ✕ | 不适用 | 不适用 | (✔) | ✕ |
元素类型的约束 | ✕ | ✕ | ✕ | ✔ | ✕ | ✕ | ✕ | ✕ |
模板参数图例:
- A 用于分配器
- T 表示元素类型
- N 表示元素数量的大小
- C 表示元素数量的容量
- O 表示选项
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。