c++ - 为双向量保留空间
问题描述
假设T
是一个类型,我想做一个vector<vector<T>>
. 我知道最终的大小将是m x n
、 wherem
和n
是运行时常量。(如果它们是编译时常量,我会使用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
。
解决方案
如果您知道内部大小将为m
,则一种可能性是制作 a std::vector<S>
,S
您的自定义类型在哪里代表 a std::vector<T>
,除非它知道它将有多少条目。这里建议了一个类似的解决方案(除了有m
一个编译时常量)。
推荐阅读
- c++ - 在 base 10 c++ 中显示 1024 位二进制数
- python - Pandas:删除具有少于 2 个非零值的项目
- javascript - Puppeteer - 将 elementHandles 传递给模板文字的方法?
- wordpress - 如何使用 $wpdb->get_results() 从数据库中获取选定的列;
- spring-boot - Spring Boot 应用程序失败,Jackson2ObjectMapperBuilder.visibility 不存在
- python-3.x - Matplotlib 文本艺术家 - 如何获得大小?(不使用 pyplot)
- google-cloud-build - Google Cloud Build:如何增加 RAM 内存?
- ms-access - 在具有多列的访问数据库中排序
- php - 如何在 Woocommerce 中以编程方式安排销售日期
- django - 如何解决 IntegrityError: NOT NULL 约束失败?