C++ 如何为std::vector数据类型分配内存?

C++ 如何为std::vector数据类型分配内存?,c++,memory-management,vector,C++,Memory Management,Vector,假设定义了以下数据结构typedef std::vector 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); 创

假设定义了以下数据结构typedef std::vector 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);
创建此变量后,您可以在VC 2010中看到此变量: 它的内容已经在那里了。因此,如果您将数据推送到这个变量上,它将再次分配内存

编辑2:


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

为向量保留内存的方式与向量包含的类型无关。如果要为MYARRAY中的n个元素保留空间,请调用MYARRAY.reserven

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

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

你基本上有三个选择:

1.不要保留记忆。将对象组合到任意位置,然后将其推入向量中。vec.push_backmyVector

2保留内存。在向量中将对象组装到位。vec[n]。推回myint

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


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

为向量保留内存的方式与向量包含的类型无关。如果要为MYARRAY中的n个元素保留空间,请调用MYARRAY.reserven

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

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

你基本上有三个选择:

1.不要保留记忆。将对象组合到任意位置,然后将其推入向量中。vec.push_backmyVector

2保留内存。在向量中将对象组装到位。vec[n]。推回myint

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


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

正如您已经指出的,std::vector的reserve方法将为更多数据项保留空间。如果要执行p1.reserve3,向量将尝试为3个整数分配空间。如果运行var.reserve3,var将尝试为3个std::vector分配空间,这听起来像是您想要做的

要分配std::vector的内部变量,可以执行以下操作:

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

然后

正如您已经指出的,std::vector有一个reserve方法,它将为更多的数据项保留空间。如果要执行p1.reserve3,向量将尝试为3个整数分配空间。如果运行var.reserve3,var将尝试为3个std::vector分配空间,这听起来像是您想要做的

要分配std::vector的内部变量,可以执行以下操作:

for(int x=0; x<var.size(); x++) var[x].reserve(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);
  }
}

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

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

那么var.reserven有什么问题吗…?为什么需要为自动处理的内容分配内存?是否正在尝试为MYARRAY中的每个向量元素分配内存?@Josh var.rserven将为var[0]…var[n]分配内存,但不会为每个向量元素分配内存

元素,例如var[0]本身,它没有分配内存。@feelfree您的帖子中的错误是因为您将reserve与resize混淆了。reserve不允许您访问已分配的空间。您仍然需要调用push_back、insert、resize等来填充给您的空间。reserve所做的是使push_back resize和insert等操作本身不需要分配内存。那么var.reserven有什么问题吗…?为什么需要为自动处理的东西分配内存?是否尝试为MYARRAY中的每个向量元素分配内存?@Josh var.rserven将为其分配内存var[0]…var[n],但不是每个元素,例如var[0]本身,它没有分配内存。@feelfree您的帖子中的错误是因为您将reserve与resize混淆了。reserve不允许您访问已分配的空间。您仍然需要调用push_back、insert、resize等来填充给您的空间。reserve所做的是使诸如push_back resize和insert之类的操作本身不需要分配内存。谢谢,但它不会起作用,因为调用var[x]是非法的。reserven因为我们还没有创建元素var[x],虽然它的内存已分配给Hanks,但我认为它不正确。std::vector varVEC_计数,std::vector;将创建对象,而不是为其分配内存。@feelfree它将创建一个向量,其中包含用于向量计数的空间,每个向量的容量为n。@Josh。。。每件尺寸为n。单参数构造函数设置向量的大小,而不仅仅是容量。@Angew这里的大小并不重要。当他使用=运算符复制新向量时,大小将被更正。谢谢,但它不会起作用,因为调用var[x]是非法的。保留,因为我们还没有创建元素var[x],尽管它的内存已分配给hanks,但我认为它不正确。std::vector varVEC_计数,std::vector;将创建对象,而不是为其分配内存。@feelfree它将创建一个向量,其中包含用于向量计数的空间,每个向量的容量为n。@Josh。。。每件尺寸为n。单参数构造函数设置向量的大小,而不仅仅是容量。@Angew这里的大小并不重要。当他使用=运算符复制新向量时,大小将被更正。var.rserven将为var[0]…var[n]分配内存,但不是为每个元素分配内存,例如var[0]本身,它没有分配正确的内存。如果要为var[0]保留内存,请调用var[0]。reserve。@David Schwartz我用VC 2010尝试过,它将显示一条提示调试断言失败的消息。@feelfree显示失败的代码。我们无法调试看不到的代码。在创建对象之前,是否尝试在对象内部保留空间?那不行。@请随时查看我的更新。你的反对没有道理。如果您保留了内存,则对象将位于您保留的内存中。你不会在其他地方有需要添加到向量的对象。这样你就不会试图推动任何事情了。因此,您不能推送的异议是无效的。var.rserven将为var[0]…var[n]分配内存,但不是为每个元素分配内存,例如var[0]本身,它没有分配正确的内存。如果要为var[0]保留内存,请调用var[0]。reserve。@David Schwartz我用VC 2010尝试过,它将显示一条提示调试断言失败的消息。@feelfree显示失败的代码。我们无法调试看不到的代码。在创建对象之前,是否尝试在对象内部保留空间?那不行。@请随时查看我的更新。你的反对没有道理。如果您保留了内存,则对象将位于您保留的内存中。你不会在其他地方有需要添加到向量的对象。这样你就不会试图推动任何事情了。因此,您不能推送的反对意见无效。我同意您的意见,因此我认为不可能为此数据结构分配内存。我同意您的意见,因此我认为不可能为此数据结构分配内存。