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

时间:2016-08-29 13:09:51

标签: 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));

}

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

terminate called after throwing an instance of 'std::bad_alloc'

所以,我这样做的方式肯定存在问题,但它很复杂,因为它适用于简单的C ++源文件,但不适用于更复杂的程序。有任何想法吗?有没有更好的方法呢?

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

2 个答案:

答案 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

相关问题