Push_back 1D-вектор как строка в массив 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)


К тому времени, когда вы нажмете 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