C++:结构向量向量的问题

JB_*_*ser 1 c++

我需要一个可变大小的二维矩阵,其中每个元素都是一个结构.行数在编译时是已知的,永远不会更改.每行的列数不同.我用矢量向量实现了这个,但我不知道我是否做得对:

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

}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?当我把它放在一个C++文件中时,上面的代码片段就可以工作了.但是,在我更大的C++程序中,上面的消息失败了

terminate called after throwing an instance of 'std::bad_alloc'
Run Code Online (Sandbox Code Playgroud)

所以,我的方式一定存在问题,但它很复杂,因为它在一个简单的C++源文件中工作,但不是在一个更大的更复杂的程序中.有任何想法吗?有没有更好的方法呢?

后期编辑:在另一个题为"我们应该何时使用向量的保留()?"的问题中,对这个问题有一个答案." 问题是,为了找到答案,我必须知道reserve()是问题的原因.就目前而言,我从来没有读过带有该标题的页面,因为我不知道reserve()是我遇到问题的原因.如果我已经知道了,那么我就已经足够了解自己解决问题了.

Bia*_*sta 6

方法:

myVVOfStructs.reserve(10);
Run Code Online (Sandbox Code Playgroud)

不会改变矢量本身的大小. 储备 - 矢量:

此函数对矢量大小没有影响,不能改变其元素.

因此,当您尝试使用以下命令访问第6个元素时:

vector< MyStruct > tmpVector = myVVOfStructs[5];
Run Code Online (Sandbox Code Playgroud)

这将产生一个UB,因为myVVOfStructs[5]它还不存在.


要更改矢量的大小,您应该使用以下方法:

mmVVOfStruct.resize(10);
Run Code Online (Sandbox Code Playgroud)