Вектор C ++удвоить ** - PullRequest
       15

Вектор C ++удвоить **

9 голосов
/ 23 января 2011

Я пытаюсь передать переменную типа vector<vector<double> > в функцию F(double ** mat, int m, int n).Функция F происходит из другой библиотеки, поэтому я не могу ее изменить.Может кто-нибудь дать мне несколько советов по этому поводу?Спасибо.

Ответы [ 3 ]

15 голосов
/ 23 января 2011

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, чтобы помочь с этим.

1 голос
/ 23 января 2011

Vector > - это не то же самое, что двойной указатель на m.Исходя из этого, предполагается, что m является двумерным массивом, а вектор может храниться неровно и не обязательно должен быть смежным в памяти.Если вы хотите передать его, вам нужно скопировать векторные значения в двойной массив temp 2dim, передав вместо этого значение.

1 голос
/ 23 января 2011

На мой взгляд, вам нужно преобразовать vector<vector<double> > в правильный тип данных, копируя все значения во вложенный массив в процессе

Вектор организован совершенно иначе, чеммассив, так что даже если бы вы могли заставить типы данных совпадать, он все равно не работал бы.

К сожалению, мой опыт работы с C ++ лежит пару лет назад, поэтому я не могу привести вам конкретный примерздесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...