首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量的向量,保留

向量的向量,保留
EN

Stack Overflow用户
提问于 2013-09-25 04:49:41
回答 3查看 20.7K关注 0票数 29

假设我想将int的二维矩阵表示为向量的向量:

代码语言:javascript
复制
std::vector<std::vector<int> > myVec;

内部维度是恒定的,比如5,外部维度小于或等于N。为了最大限度地减少重新分配,我想保留空间:

代码语言:javascript
复制
myVec.reserve(N);

假设内部向量的大小是多少?这是纯依赖于实现的吗?这对数据的空间局部性有什么影响?由于内部维度是常量,有没有办法告诉编译器使用这个常量大小?如果内部向量的大小发生变化,这些答案会发生什么变化?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-25 05:20:18

因为你的内在维度是恒定的,我认为你想要

代码语言:javascript
复制
std::vector< std::array<int, 5> > vecs;
vecs.reserve(N);

这将为您提供预先分配的连续存储,这是最佳的性能。

票数 19
EN

Stack Overflow用户

发布于 2013-09-25 04:51:16

内部向量的大小与调整外部向量的大小完全无关。你的向量包没有局部性保证,局部性保证(即内存中的邻接块)只存在于单个向量。

请记住,矢量对象本身具有常量sizeof-size,其实际数据通常是动态分配的。第一次近似地说,外部向量是指向内部向量的N个“指针”的连续块。您的reserve调用不会为内部向量的可能元素保留内存,而只为内部向量对象本身保留内存(即它们的记账数据和指向其动态分配的数据块的指针)。

票数 13
EN

Stack Overflow用户

发布于 2013-09-25 05:02:43

内部向量使用默认构造函数进行初始化。因此,如果你这样写:

代码语言:javascript
复制
vector<vector<int> > vecs;
vecs.reserve(10);

这相当于为每个元素调用vector<int>vector<int>()的构造器。这意味着你将有一个大小为零的向量。但请记住,除非调整(而不是保留)向量的大小,否则不能使用它们。

还请记住,有时根据您需要的初始大小调整大小可能会更有效。所以做一些像这样的事情很有用

代码语言:javascript
复制
vector<vector<int> > vecs(3,vector<int>(5));

这将创建一个大小为3的向量,每个元素将包含一个大小为5的向量。

还请记住,如果您要经常调整向量的大小,使用deque可能比使用vector更有效。它们很容易使用(作为向量),而且不需要保留,因为元素在内存中不是连续的。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18991765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档