вектор векторов не совпадает с массивом массивов (2D, матрица).
В то время как одномерный vector<double>.data()
указывает на непрерывное пространство памяти (например, вы можете сделать memcpy
на этом ) каждый из «подвекторов» выделяет собственный, отдельный буфер памяти. Поэтому vector<vector<double>>.data()
не имеет смысла и не может использоваться в качестве матрицы.
В C ++ двумерный массив array2D[W][H]
хранится в памяти идентично array[W*H]
. Поэтому оба могут обрабатываться одними и теми же процедурами (когда это имеет смысл). Рассмотрим следующий пример:
void fill_array(double *array, size_t size, double value) {
for (size_t i = 0; i < size; ++i) {
array[i] = value;
}
}
int main(int argc, char *argv[])
{
constexpr size_t W = 10;
constexpr size_t H = 5;
double matrix[W][H];
// using 2D array as 1D to fill all elements with 5.
fill_array(&matrix[0][0], W * H, 5);
for (const auto &row: matrix) {
for (const auto v : row) {
cout << v << '\t';
}
cout << '\n';
}
return 0;
}
В приведенном выше примере вы можете заменить double matrix[W][H];
на vector<double> matrix(W * H);
и ввести matrix.data()
в fill_array()
. Однако вы не можете объявить вектор (W) для вектора (H).
PS Существует множество реализаций математического вектора и матрицы на языке C ++. Вы можете использовать один из них, если не хотите иметь дело с массивами C.