假设定义了以下数据结构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)
来分配内存。
修改 已经提出了两个建议,但两者都不起作用:
var.reserve(3); for(int i = 0; i&lt; 3; i ++) 变种[I] .reserve [20];
我使用VC 2010在调试模式下编译和运行代码,并给出以下错误消息:
解决方案2:在开头创建对象
std::vector<std::vector<int> > var(3, std::vector<int>(5));
创建此变量后,您可以在VC 2010中看到此变量: 它的内容已经存在。因此,如果您在此变量上推送数据,它将再次分配内存。
编辑2:
有人对使用此变量之前需要分配内存的原因感兴趣,主要原因是因为Windows的运行时库。变量var
在可执行程序中定义为空变量,其内容由动态库中定义的函数给出。如果两者都使用动态运行时库,则不会出现问题。但在我的情况下,两者都与静态运行时库链接,这意味着每个模块负责其内存分配。由于var
是在可执行程序中定义的,因此它也应该处理它的内存分配。
答案 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));
答案 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);
}
}