我有一个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
非常感谢任何帮助!
答案 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()));
}