![](/img/trans.png)
[英]Can I recast the memory in a std::vector to a completely different type?
[英]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)
分配内存。
编辑:提出了两个建议,但两个都行不通:
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
是在可执行程序中定义的,因此还应注意其内存分配。
为向量保留内存的方式与向量所包含的类型无关。 如果要在MYARRAY
为n
元素保留空间,请调用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.