Push_back 1D вектор като ред в 2D векторен масив

Опитвам се да дефинирам стойностите на „ред“ или 1D вектор и след това push_back този ред в 2D вектор. Опитах няколко различни неща, които не дават грешки, но също така не изглежда да работят. Код по-долу:

#include <vector>
#include <iostream>
using std::vector;

#define HEIGHT 5
#define WIDTH 3

// 2D VECTOR ARRAY EXAMPLE

int main() {
vector<vector<double> > array2D;
vector<double> currentRow;

// Set up sizes. (HEIGHT x WIDTH)
// 2D resize
array2D.resize(HEIGHT);
for (int i = 0; i < HEIGHT; ++i)
{
  array2D[i].resize(WIDTH);
}
// Try putting some values in
array2D[1][2] = 6.0; // this works
array2D[2].push_back(45); // this value doesn't appear in vector output.  Why?

// 1D resize
currentRow.resize(3);

// Insert values into row
currentRow[0] = 1;
currentRow[1] = 12.76;
currentRow[2] = 3;

// Push row into 2D array
array2D.push_back(currentRow); // this row doesn't appear in value output.  Why?

// Output all values
for (int i = 0; i < HEIGHT; ++i)
{ 
  for (int j = 0; j < WIDTH; ++j)
    {  
        std::cout << array2D[i][j] << '\t';
  }
  std::cout << std::endl;
 }
 return 0;
}

person ProGirlXOXO    schedule 01.03.2012    source източник


Отговори (3)


Докато натиснете push_back currentRow, array2D вече съдържа HEIGHT редове и след push_back ще съдържа HEIGHT+1 редове. Просто не показвате последния добавен от вас, а само първите HEIGHT редове.

person sellibitze    schedule 01.03.2012
comment
Явно нямам достатъчно репутация, за да гласувам за теб. Но благодаря! - person ProGirlXOXO; 02.03.2012

push_back() добавя елемент към края на вектора. Ако векторът съдържа WIDTH елемента, той съдържа WIDTH+1 елемента след push_back().

Когато отпечатвате съдържанието на вектора, отпечатвате само първите WIDTH елемента, дори ако векторът съдържа повече, така че не виждате допълнителните елементи.

Можете да разберете колко елемента има във вектор с метода size().

person sth    schedule 01.03.2012

Вие използвате resize, когато всъщност искате да използвате reserve метод вместо това. Работата е там, че промяната на размера променя съдържанието на вектора, докато резервът просто променя капацитета за съхранение. Така че, ако преоразмерите вектор до N елемента и след това поставите някои елементи в него, те ще бъдат поставени на позиции N, N + 1 и т.н., докато ако просто запазите размер за N елемента, те ще бъдат поставени на позиции 0, 1 и т.н., което изглежда искате.

person Win32    schedule 01.03.2012