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
任何帮助都非常感激!
您可以传递第一个元素的地址,例如:
#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 vector1向量是一种支持随机访问迭代器的序列.此外,它支持(摊销)最后的恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.的
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)
这迫切需要一个普遍的解决方案.
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指针添加了函数的第二个版本.