我需要一个可变大小的二维矩阵,其中每个元素都是一个结构.行数在编译时是已知的,永远不会更改.每行的列数不同.我用矢量向量实现了这个,但我不知道我是否做得对:
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()是我遇到问题的原因.如果我已经知道了,那么我就已经足够了解自己解决问题了.
方法:
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)
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |