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

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

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

PS:getPeaks() 返回一个int向量!

4

2 回答 2

4

我认为push_back不会像你认为的那样做。

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

在构造时将 4 传递给向量已经创建了 4 个空int向量。如果您push_back将 4 个向量t1,t2和另外 4 个向量添加到t3,那么您实际上有 8 个条目。也许删除并只写:t4frameVecsframeVecs(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在此示例中也不需要调用。

于 2013-05-03T08:51:59.887 回答
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 动态增加大小,你很少想要两者都做。

于 2013-05-03T09:01:57.170 回答