首页 > 解决方案 > 为双向量保留空间

问题描述

假设T是一个类型,我想做一个vector<vector<T>>. 我知道最终的大小将是m x n、 wheremn是运行时常量。(如果它们是编译时常量,我会使用std::array<std::array<T, n>, m>。)假设在认真继续我的程序之前,我有三个选择来处理我的双向量:

选项1

std::vector<std::vector<T>> dbl_vect(m);
for (auto & v : dbl_vect)
    v.reserve(n);

选项 2

std::vector<std::vector<T>> dbl_vect;
dbl_vect.reserve(m);

选项 3

std::vector<std::vector<T>> dbl_vect;

假设我不担心向量重新分配导致的迭代器和引用失效,因此我们可以将其从决策过程中删除。

当然,后面的代码会有所不同,因为 #1 创建了 dbl_vector 的(空)行,所以我们必须访问这些行而不是推回更多行。

选项#2 似乎相当无用,因为它不知道为每一行保留多少空间。

选项 #1 要求我通过m空向量的线性传递并手动调整它们的大小,但它可以防止重新分配。如果T相当大,我相信这几乎肯定会更可取,因为它会阻止复制/移动。

问题:假设T = char(或选择您最喜欢的 POD 类型)。在什么情况下我应该对选项1和3无动于衷,甚至更喜欢#3?这主要是由于 a 的相对较小的大小char,还是因为编译器将(不)默认初始化 a 的方式char?如果T更大,可能是用户定义的,我应该在什么时候开始关心(双向量的大小或 的大小T)?

这里提出了一个有点类似的问题,关于一个向量 和T=int

标签: c++vectordynamic-memory-allocation

解决方案


如果您知道内部大小将为m,则一种可能性是制作 a std::vector<S>S您的自定义类型在哪里代表 a std::vector<T>,除非它知道它将有多少条目。这里建议了一个类似的解决方案(除了有m一个编译时常量)。


推荐阅读