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

时间:2009-08-25 16:31:18

标签: c++ function vector const

我有一个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:错误:不能   将“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 个答案:

答案 0 :(得分:8)

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

#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是一个   矢量,其中T是一些   除了布尔之外的类型,然后它服从   身份:

&v[n] == &v[0] + n for
all 0 <= n < v.size().

答案 1 :(得分: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]));

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

答案 2 :(得分:0)

我认为

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

正在返回std:vector类型double

答案 3 :(得分:0)

所以,以下似乎对我有用:

#include <vector>

void fun(const double data[])
{

}

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