2013-05-03 1 views
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 во время отклика части фрагмента.Ошибка при использовании 2d векторов в C++

Всего два дня назад я был с этим кодом, который делает то же самое:

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 ошибку в PushBack части и, следовательно, мне пришлось изменить эту конкретную часть на ту, что была над ней, и все же я получаю эту ошибку.

Я имею в виду, что vectors настолько неопределенны в своем поведении?

PS: getPeaks() возвращает int вектор!

+0

Я попытался воспроизвести проблему с предоставленным кодом, но ничего плохого не происходит. Если рассматриваемый код не изменился, когда проблема впервые возникла, это может быть проблема многопоточности. Что вы пытаетесь выполнить с печатью 'endl' после каждого' push_back'? – Excelcius

+1

, пожалуйста, предоставьте [SSCE] (http://sscce.org/) – TemplateRex

+0

Боясь, что это ваше понимание, которое является неопределенным. Из-за этого вы делаете его более сложным, чем это должно быть. – john

ответ

4

думаю push_back не делает, что вы думаете.

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

Переходя 4 к вектору на строительство уже создает 4 пустые int -векторов. Если вы push_back 4 вектора t1, t2, t3 и t4 вы добавите еще 4 вектора в frameVecs, так что у вас на самом деле есть 8 записей в frameVecs. Возможно удаление (4) и просто писать:

vector <vector <int>> frameVecs; 

решит проблему.

Если вы сейчас попытаетесь получить доступ к frameVecs[0][0], например (хотя и не показано в вашем примере), вы получите сообщение об ошибке.

После 4 push_backframeVecs выглядит следующим образом:

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 также ненужный в этом примере.

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, редко вы хотите сделать оба.

+0

Я думаю, что оба наших ответа в порядке, но я все еще верю, что в этом примере чего-то не хватает. Нигде рядом с 'push_back' он не обращается к любому из векторов, и лишние выходы' endl' приводят меня к предположению, что он пропустил что-то вроде 'cout << frameVecs [0] [0] << endl;' из примера. – Excelcius