vector<vector<double>>
и double**
- довольно разные типы.Но эту функцию можно передать с помощью другого вектора, который хранит несколько двойных указателей:
#include <vector>
void your_function(double** mat, int m, int n) {}
int main() {
std::vector<std::vector<double>> thing = ...;
std::vector<double*> ptrs;
for (auto& vec : thing) {
// ^ very important to avoid `vec` being
// a temporary copy of a `thing` element.
ptrs.push_back(vec.data());
}
your_function(ptrs.data(), thing.size(), thing[0].size());
}
Одна из причин, по которой это работает, заключается в том, что std::vector
гарантирует, что все элементы хранятся последовательно в памяти.
Если возможно, рассмотрите возможность изменения сигнатуры вашей функции.Обычно матрицы располагаются линейно в памяти.Это означает, что доступ к элементу матрицы может быть выполнен с помощью некоторого базового указателя p
типа double*
для верхнего левого коэффициента и некоторого вычисленного линейного индекса на основе строки и столбцов, таких как p[row*row_step+col*col_step]
, где row_step
и col_step
смещения, зависящие от макета.Стандартная библиотека не предлагает никакой помощи с такими структурами данных.Но вы можете попытаться использовать Boost multi_array
или GSL multi_span
, чтобы помочь с этим.