我已经开始使用gsl fitting examples的示例,并尝试将数组更改为向量。但是当我编译我的代码时,它会导致错误,我不明白并且不知道我的代码有什么问题,我提前感谢任何评论:
example1.cpp:19:73:错误:无法将'std :: vector'转换为'const double *'以将参数'1'转换为'int gsl_fit_linear(const double *,size_t,const double *,size_t,size_t ,double *,double *,double *,double *,double *,double *)' gsl_fit_linear(x,1,y,1,n,& c0,& c1,& cov00,& cov01,& cov11,& sumsq);
这是代码:
#include <iostream>
#include <vector>
#include <gsl/gsl_fit.h>
using namespace std;
int main (void)
{
int n = 5;
vector <double> x(5,0);
vector <double> y(5,0);
for(int i=0 ; i< 5; i++)
x[i] = i*3.2;
for(int i=0 ; i< 5; i++)
x[i] = i*2-11.6;
double c0, c1, cov00, cov01, cov11, sumsq;
gsl_fit_linear (x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
return 0;
}
答案 0 :(得分:2)
我想补充一点,c ++ 11引入了成员函数vector :: data(),它返回向量的原始指针。 vector :: data()优于@king_nak方法的优点是什么?
1)清晰度。这是主观的,但我认为使用更优雅 (...)
gsl_fit_linear (x.data(), 1, y.data(), 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
(...)
2)const-correctness。 vector :: data()有一个重载函数,当函数只需要读取数据时返回const指针
3)空容器。 This answer也引用了这样一个事实:即使向量为空,也可以使用vector :: data。 (将空容器发送到gsl是不行的,但通常这是一个额外的好功能)
答案 1 :(得分:1)
函数gsl_fit_linear
不会将向量作为输入,而是const double *
。您必须将矢量转换为数组。
由于向量保证将其元素存储在连续的内存区域(就像数组一样),因此可以像数组一样使用向量的数据。只需获得指向其第一个元素的指针:
double *xAsArray = &x.front();
请注意:如果更改了矢量(添加/删除元素),指针最可能会失效!
您应该像这样调用您的函数:
sl_fit_linear (&x.front(), 1, &y.front(), 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);