在c ++中使用2d向量时出错

时间:2013-05-03 08:38:41

标签: c++ vector stl

vector <vector <int>> frameVecs(4);
vector <int> t1 = getPeaks (vec1);
vector <int> t2 = getPeaks (vec2);
vector <int> t3 = getPeaks (vec3);
vector <int> t4 = getPeaks (vec4);

frameVecs[0].reserve(t1.size());
frameVecs[1].reserve(t2.size());
frameVecs[2].reserve(t3.size());
frameVecs[3].reserve(t4.size());

frameVecs.push_back (t1);
frameVecs.push_back (t2);
frameVecs.push_back (t3);
frameVecs.push_back (t4);

在代码段的后推部分,我总是遇到subscript out of range错误。

仅仅两天前我就用这个代码做了同样的事情:

vector <vector <int>> frameVecs;

frameVecs.push_back (getPeaks (vec1));
frameVecs.push_back (getPeaks (vec2));
frameVecs.push_back (getPeaks (vec3));
frameVecs.push_back (getPeaks (vec4));

这在过去的两个月里运行得很好..突然我开始在后推部分出现subscript out of range错误,因此我不得不将特定部分更改为上面的部分,而我仍然是得到这个错误。

我的意思是,vectors他们的行为如此不确定吗?

PS:getPeaks()返回int向量!

2 个答案:

答案 0 :(得分:4)

我认为push_back不符合你的想法。

vector <vector <int>> frameVecs(4);

将4传递给构造上的向量已经创建了4个空int - 向量。如果您push_back 4个向量t1t2t3t4,则向frameVecs添加另外4个向量,因此实际上有8个向量frameVecs中的条目。也许删除(4)并写下:

vector <vector <int>> frameVecs;

将解决问题。

如果您现在尝试访问frameVecs[0][0](例如,虽然未在您的示例中显示),但您会收到错误消息。

第4个push_back frameVecs看起来像这样:

frameVecs[0] // empty
frameVecs[1] // empty
frameVecs[2] // empty
frameVecs[3] // empty
frameVecs[4] // contains t1
frameVecs[5] // contains t2
frameVecs[6] // contains t3
frameVecs[7] // contains t4

此示例中也不需要调用reserve

答案 1 :(得分:0)

Excelcius的答案很好,但这是我认为你想做的另一种方式。

vector <vector <int>> frameVecs(4);
frameVecs[0] = getPeaks (vec1);
frameVecs[1] = getPeaks (vec2);
frameVecs[2] = getPeaks (vec3);
frameVecs[3] = getPeaks (vec4);

这里的主要内容是此代码比您的代码更简单。当简单的事情变得像你的代码一样复杂时,很明显表明出现了问题。

主要的误解似乎是要么你在构造函数中设置向量的大小,要么使用push_back动态增加大小,很少你想要同时做