如何为std :: vector <std :: vector <int>&gt;分配内存?数据类型?</std :: vector <int>

时间:2014-08-28 15:41:36

标签: c++ memory-management vector

假设定义了以下数据结构typedef std::vector<std::vector<int> > 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<int> var2,我可以在使用之前使用var2.reserve(n)来分配内存。

修改 已经提出了两个建议,但两者都不起作用:

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

var.reserve(3);     for(int i = 0; i&lt; 3; i ++)         变种[I] .reserve [20];

我使用VC 2010在调试模式下编译和运行代码,并给出以下错误消息:enter image description here

  • 解决方案2:在开头创建对象

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

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

编辑2:

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

3 个答案:

答案 0 :(得分:3)

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

  

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

右。你想要保留记忆吗?如果要保留内存,则必须使用保留的内存。为了让你在这个变量&#34;上推送数据,你必须将数据放在某处,而不是你保留的内存。如果您保留内存并使用该内存,那么您将永远无法推送任何内容,因为这意味着您拥有的内容不是您保留的内存中的某些内容,而是需要添加到该内容中,而这些内容是您无法实现的。 ;可能有。

你基本上有三个选择:

1)不要保留记忆。在任何地方组装对象,然后将它们推入向量中。 vec.push_back(myVector);

2)预约记忆。将对象组装到向量中的适当位置。 vec[n].push_back(myInt);

3)保留记忆。在任何地方组装对象,然后将它们分配到您保留的内存中。 vec[n]=myIntVector

请注意,在这些情况下,您都不会保留记忆,然后按下矢量。

答案 1 :(得分:2)

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

要为std::vector内的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.

答案 2 :(得分:2)

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

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);
  }
}