арифметика указателей на векторы в с ++ - PullRequest
0 голосов
/ 26 августа 2009

у меня есть std :: vector, а именно

vector<vector<vector> > > mdata;

я хочу передать данные из моего вектора mdata в функцию GSL

gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size);

как я. я уже понял, что я могу делать такие вещи, как

gsl_spline_init(spline, &(mgrid.front()), &(mdata[i][j][k].front()), mgrid.size());

Это нормально, если я хочу передать данные из mdata для фиксированных i, j в gsl_spline_init ().

однако теперь мне нужно пройти по первому измерению mdata, поэтому для фиксированного j, k.

Я знаю, что для любых двух фиксированных индексов все векторы по оставшимся измерениям имеют одинаковую длину, поэтому мой вектор является «регулярным кубом». поэтому смещение между всеми необходимыми мне значениями должно быть одинаковым.

конечно, я мог бы создать временный вектор

int j = 123;
int k = 321;
vector<double> tmp;
for (int i = 0: i < mdata.size(); i++)
    tmp.push_back(mdata[i][j][k]);
gsl_spline_init(spline, &(mgrid.front()), &(tmp.front()), mgrid.size());

но это кажется слишком сложным. возможно, есть способ достичь моей цели с помощью арифметики с указателями?

любая помощь очень ценится:)

Ответы [ 2 ]

1 голос
/ 26 августа 2009

Этого нельзя сделать. Не только с векторами, но даже с простыми массивами только последнее измерение является непрерывным блоком данных. Если бы gsl_spline_init взял итератор вместо массива, вы могли бы попытаться создать некоторый функтор для выбора подходящих данных, но я не уверен, что стоит попробовать. Никакая арифметика указателей вам не поможет.

1 голос
/ 26 августа 2009

Вы действительно не можете сделать это без изменения функции потребителя массива gsl_spline_init () - она ​​полагается на то, что передаваемые данные являются непрерывным блоком данных. Это не относится к вашему трехуровневому вектору - не только это куб, но и каждый уровень имеет отдельный буфер, выделенный в куче.

...