繁体   English   中英

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

[英]How can I allocate memory for the std::vector<std::vector<int> > data type?

假设定义了以下数据结构typedef std::vector<std::vector<int> > MYARRAY 然后对于变量MYARRAY var ,如何在将数据推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 <3; i ++)var [i] .reserve [20];

我使用VC 2010在调试模式下编译和运行代码,并给出以下错误消息: 在此处输入图片说明

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

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

    创建此变量后,您可以在VC 2010中看到此变量: 在此处输入图片说明 它的内容已经在那里。 因此,如果将数据压入该变量,它将再次分配内存。

编辑2:

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

为向量保留内存的方式与向量所包含的类型无关。 如果要在MYARRAYn元素保留空间,请调用MYARRAY.reserve(n);

它的内容已经在那里。 因此,如果将数据压入该变量,它将再次分配内存。

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

您基本上有三个选择:

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

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

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

请注意,在所有这些情况下,都不会保留内存,然后压入向量。

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

var 内部分配std::vector ,您可以执行以下操作:

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

然后复制新的向量。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM