如何将stl向量传递给一个带有const [](c ++)的函数

and*_*s-h 2 c++ const function vector

我有一个3d stl矢量,

vector<vector<vector<double> > > mdata;
Run Code Online (Sandbox Code Playgroud)

我也有一个功能

myfun(const double ya[]);
Run Code Online (Sandbox Code Playgroud)

更准确地说,它是GNU科学图书馆的一个功能,

gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size);
Run Code Online (Sandbox Code Playgroud)

但这与我的问题无关.

所以现在我想将数据的"最后"维度传递给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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是编译器(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:错误:不能转换’ std::vector<double, std::allocator<double> >*"到" const double*"的参数"3"到" int gsl_spline_init(gsl_spline*, const double*, const double*, size_t)"使:***[Calculator.o]错误1

任何帮助都非常感激!

Ara*_*raK 8

您可以传递第一个元素的地址,例如:

#include <vector>

void fun(const double data[])
{

}

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

元素vector是连续存储的.所以这种方式是标准的,我希望:)

23.2.4 Class template vector

1向量是一种支持随机访问迭代器的序列.此外,它支持(摊销)最后的恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.的 elements of a vector are stored 连续,这意味着如果v是一个矢量,其中T是某种类型的比布尔其它,那么它遵循身份:

&v[n] == &v[0] + n for
all 0 <= n < v.size().
Run Code Online (Sandbox Code Playgroud)

  • 只要至少有一个元素,它就可以工作.并且还要注意,你可能只访​​问`data3d [0] [0] [0] .size()`元素,因为其他"子数组"(矢量确实)不是紧挨着它分配的(这看起来很明显,但我很快就容易被忽视. (5认同)

Mar*_*som 5

这迫切需要一个普遍的解决方案.

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]));
Run Code Online (Sandbox Code Playgroud)

编辑:我在评论中建议添加了矢量分配器的模板参数; 我也使用at()而不是[]所以我不必检查空向量,并为const指针添加了函数的第二个版本.