【问题标题】:How can I allocate memory for the std::vector<std::vector<int> > data type?如何为 std::vector<std::vector<int> > 数据类型分配内存?
【发布时间】:2014-08-28 15:41:36
【问题描述】:

假设定义了以下数据结构typedef std::vector&lt;std::vector&lt;int&gt; &gt; MYARRAY。那么对于变量MYARRAY var,在将数据推入其中之前,如何为该变量分配内存。例如,

std::vector<int> p1; 
p1.push_back(1);
p1.push_back(2);
std::vector<int> p2;
p2.push_back(22);
p2.push_back(33);
var.push_back(p1);
var.push_back(p2);

如果我们不为var分配内存,那么它会自动分配内存。那么如何在将数据推送到内部之前为这个 var 分配内存呢?如果是std::vector&lt;int&gt; var2,我可以在使用前使用var2.reserve(n)分配内存。

编辑: 提出了两个建议,但都不起作用:

  • 解决方案 1:为每个元素分配内存

var.reserve(3); for(int i=0; i

我用VC 2010在debug模式下编译运行代码,报错如下:

  • 方案2:一开始就创建对象

       std::vector<std::vector<int> > var(3, std::vector<int>(5));
    

    创建此变量后,您可以在 VC 2010 中看到此变量: 它的内容已经存在。因此,如果您在此变量上推送数据,它将再次分配内存。

编辑 2:

有人对为什么我在使用这个变量之前需要分配内存感兴趣,主要是因为windows的运行时库。变量var在可执行程序中定义为空变量,其内容由动态库中定义的函数给出。如果两者都使用动态运行时库,那将不是问题。但在我的情况下,两者都与静态运行时库链接,这意味着每个模块都负责其内存分配。由于var 是在可执行程序中定义的,它还应该注意其内存分配。

【问题讨论】:

  • 那么var.reserve(n)...有什么问题?
  • 为什么需要为自动处理的东西分配内存?
  • 您是否要为 MYARRAY 中的每个向量元素“分配内存”?
  • @Josh var.rserve(n) 将为 var[0]...var[n] 分配内存,但不会为每个元素分配内存,例如 var[0] 本身,它没有分配内存.
  • @feelfree 您在帖子中的错误是因为您将reserveresize 混淆了。 reserve 让您访问您分配的空间。您仍然需要致电push_backinsertresize 等来填写给您的空间。 reserve所做的就是让push_backresizeinsert等操作不需要自己分配内存。

标签: c++ memory-management vector


【解决方案1】:

为向量保留内存的方式与向量包含的类型无关。如果您想为MYARRAY 中的n 元素保留空间,请致电MYARRAY.reserve(n);

它的内容已经存在。因此,如果你在这个变量上推送数据,它会再次分配内存。

没错。是否要保留内存?如果要保留内存,则必须使用保留的内存。为了让您“在此变量上推送数据”,您必须将数据保存在您保留的内存之外的某个地方。如果您保留内存并使用该内存,那么您将永远无法推送任何内容,因为这意味着您在保留的内存之外的某个地方需要添加到向量中,而您不可能拥有.

你基本上有三个选择:

1) 不要保留内存。将对象组装到您想要的任何位置,然后将它们推入向量中。 vec.push_back(myVector);

2) 预留内存。将对象组装在向量中的适当位置。 vec[n].push_back(myInt);

3) 预留内存。将对象组装到您想要的任何位置,然后将它们分配到您保留的内存中。 vec[n]=myIntVector

请注意,在这些情况下,您都不会保留内存然后将其推入向量中。

【讨论】:

  • var.rserve(n) 将为 var[0]...var[n] 分配内存,但不会为每个元素分配内存,例如 var[0] 本身,它没有分配内存跨度>
  • 没错。如果您想为var[0] 保留内存,请调用var[0].reserve
  • @David Schwartz 我尝试使用 VC 2010,它会引起 Debug Assertion Failed 消息的有趣。
  • @feelfree 显示失败的代码。我们无法调试我们看不到的代码。 (在创建对象之前,您是否尝试在对象内部保留空间?那是行不通的。)
  • @feelfree 查看我的更新。你的反对没有道理。如果您保留了内存,您的对象将在您保留的内存中。您不会在其他地方有一些需要添加到向量中的对象。所以你不会试图推动任何事情。所以你不能推的反对是无效的。
【解决方案2】:

正如您已经指出的那样,std::vector 具有 reserve 方法,该方法将为更多数据项保留空间。如果您要执行p1.reserve(3)vector 将尝试为 3 个整数分配空间。如果您运行var.reserve(3)var 将尝试为 3 个std::vector&lt;int&gt; 分配空间,这听起来像是您想要做的。

要分配std::vectorinside var,你可以这样做:

for(int x=0; x<var.size(); x++) var[x].reserve(n);

编辑

如果要在插入向量之前分配空间,可以将var 声明为:

std::vector<std::vector<int> > var(VEC_COUNT, std::vector<int>(n));

然后copy the new vectors in.

【讨论】:

  • 谢谢,但它不起作用,因为调用 var[x].reserve(n) 是非法的,因为我们还没有创建元素 var[x] 虽然它的内存已经分配了跨度>
  • 谢谢,但我不认为这是正确的。 std::vector<:vector> > var(VEC_COUNT, std::vector(n));将创建对象而不是为其分配内存。
  • @feelfree 它将创建一个vector,其中包含VEC_COUNT 向量的空间,每个向量的容量为n
  • @Josh ...每个大小为n。单参数构造函数设置向量的大小,而不是(仅)容量。
  • @Angew 在这里size 是什么并不重要。当他使用= 操作符复制新向量时,大小将被修正。
【解决方案3】:

在向量存在之前,您不能为向量的数据保留空间。我相信你正在寻找这个:

void reserve(MYARRAY &arr, size_t dim1, size_t dim2)
{
  arr.resize(dim1);
  for (size_t idx = 0; idx < dim1; ++idx) {
    arr[idx].reserve(dim2);
  }
}

【讨论】:

  • 我同意你的观点,因此我认为不可能为这个数据结构分配内存。
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多