как передать вектор stl в функцию, которая принимает const [] (c ++) - PullRequest
2 голосов
/ 25 августа 2009

у меня есть вектор 3d stl,

vector<vector<vector<double> > > mdata;

У меня также есть функция

myfun(const double ya[]);

точнее, это функция из научной библиотеки GNU,

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

но это не связано с моей проблемой.

так что теперь я хочу передать «последнее» измерение данных в myfun. Я пытался это:

for (int s = 0; s < msize; s++) {
    accelerators = new gsl_interp_accel*[msize];
    splines = new gsl_spline*[msize];
    for (int i = 0; i < msize; i++) {
        accelerators[i] = gsl_interp_accel_alloc();
        splines[i] = gsl_spline_alloc(gsl_interp_cspline_periodic, msize+1);
        gsl_spline_init(splines[i], &(*mgrid.begin()), &(*mdata[s][i].begin()), msize+1);
    }
}

Но компилятор (g ++, 64bit, Ubuntu) жалуется:

В функции-члене 'std::vector<std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >, std::allocator<std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > > > SimpleAmfCalculator::interp_m(int): Calculator.cpp: 100: ошибка: невозможно преобразовать 101 std::vector<double, std::allocator<double> >* ’в‘ const double* ’для аргумента‘ 3 ’в‘ int gsl_spline_init(gsl_spline*, const double*, const double*, size_t) ’make: *** [Calculator.o] Ошибка 1

Любая помощь очень ценится!

Ответы [ 4 ]

8 голосов
/ 25 августа 2009

Вы можете передать адрес первого элемента, например:

#include <vector>

void fun(const double data[])
{

}

int main()
{
    std::vector<std::vector<std::vector<double> > > data3d;
    ....
    fun(&data3d[0][0][0]);
}

Элементы vector хранятся непрерывно. Таким образом, этот путь является стандартным, как я надеюсь :)

23.2.4 Class template vector

1 Вектор является своего рода последовательность, которая поддерживает произвольный доступ итераторы. Кроме того, он поддерживает (амортизированное) постоянное время вставки и стереть операции в конце; вставить и стереть в середине взять линейный время. Управление хранением осуществляется автоматически, хотя подсказки могут быть дано для повышения эффективности. elements of a vector are stored непрерывно , что означает, что если v является вектор, где Т является некоторым типа отличного от bool, тогда он подчиняется личность:

&v[n] == &v[0] + n for
all 0 <= n < v.size().
5 голосов
/ 25 августа 2009

Это требует общего решения.

template<typename T, typename A>
T* PointerOf(std::vector<T,A> & vec)
{
    return &vec.at(0);
}

template<typename T, typename A>
const T* ConstPointerOf(const std::vector<T,A> & vec)
{
    return &vec.at(0);
}

myfun(ConstPointerOf(mdata[s][i]));

Редактировать: Я добавил параметр шаблона для векторного распределителя, как предложено в комментариях; Я также использовал at () вместо [], чтобы мне не пришлось проверять наличие пустого вектора, и я добавил вторую версию функции для константного указателя.

0 голосов
/ 22 сентября 2009

Итак, мне кажется, что работает следующее:

#include <vector>

void fun(const double data[])
{

}

int main()
{
    std::vector<std::vector<std::vector<double> > > data3d;
    ....
    fun(&(data3d[0][0].front()));
}
0 голосов
/ 25 августа 2009

Я думаю

&(*mdata[s][i].begin());

возвращает std:vector типа double.

...