我需要一个可变大小的二维矩阵,其中每个元素都是一个结构。行数在编译时是已知的,永远不会更改。每行的列数不同。我用矢量向量实现了这个,但我不知道我是否做得对:
struct MyStruct {
int a, b;
MyStruct(int arg_a, int arg_b) { a = arg_a; b = arg_b; };
};
int main(void) {
vector < vector< MyStruct > > myVVOfStructs;
myVVOfStructs.reserve(10); // Intended to reserve 10 rows of variable size vectors
vector< MyStruct > tmpVector = myVVOfStructs[5];
tmpVector.push_back(MyStruct(10, 20));
}
这是正确的方法吗?当我把它放在一个C ++文件中时,上面的代码片段就可以工作了。但是,在我更大的C ++程序中,上面的消息失败了
terminate called after throwing an instance of 'std::bad_alloc'
所以,我这样做的方式肯定存在问题,但它很复杂,因为它适用于简单的C ++源文件,但不适用于更复杂的程序。有任何想法吗?有没有更好的方法呢?
后期编辑:在另一个标题为“#34;我们应该何时使用向量的保留()?&#34;”的问题中,对这个问题有了答案。问题是,为了找到答案,我必须知道reserve()是导致问题的原因。就目前而言,我从来没有读过带有该标题的页面,因为我不知道reserve()是我遇到问题的原因。如果我已经知道了,那么我就已经足够了解自己解决问题了。
答案 0 :(得分:6)
方法:
myVVOfStructs.reserve(10);
不会更改矢量本身的大小。 Reserve - Vector:
此功能对矢量大小没有影响,不能改变其元素。
因此,当您尝试使用以下内容访问第6个元素时
vector< MyStruct > tmpVector = myVVOfStructs[5];
这将产生一个UB,因为myVVOfStructs[5]
尚不存在。
要更改矢量的大小,您应该使用以下方法:
mmVVOfStruct.resize(10);
答案 1 :(得分:-1)
请求更改容量 要求矢量容量至少足以包含n个元素。
如果n大于当前矢量容量,则该函数会使容器重新分配其存储,将其容量增加到n(或更大)。
在所有其他情况下,函数调用不会导致重新分配,矢量容量也不会受到影响。
此功能对矢量大小没有影响,不能改变其元素。
您将使用std :: vector :: resize