C++ gsl_向量是否有计数函数?C/C++;

C++ gsl_向量是否有计数函数?C/C++;,c++,arrays,vector,gsl,countif,C++,Arrays,Vector,Gsl,Countif,我正在使用gnu科学图书馆(GSL)。 假设我有一个像这样的gsl\u向量: 7 0-6 5 8 0 10-2 这是一个包含正数、负数和零元素的向量 我想计算此gsl\u向量中非零元素或零元素的数量。 我知道C++的向量有一个函数,叫做“代码> CurtTyI:< /COD>”。但是我在gsl_vector.h和gsl_blas.h中搜索,没有任何函数可以与之相等。 我可以通过gsl\u vector\u get()评估所有元素,然后问if问题 int counter = 0; for(int

我正在使用gnu科学图书馆(GSL)。 假设我有一个像这样的
gsl\u向量
: 7 0-6 5 8 0 10-2

这是一个包含正数、负数和零元素的向量

我想计算此
gsl\u向量中非零元素或零元素的数量。
我知道C++的向量有一个函数,叫做“代码> CurtTyI:< /COD>”。但是我在
gsl_vector.h
gsl_blas.h
中搜索,没有任何函数可以与之相等。 我可以通过
gsl\u vector\u get()
评估所有元素,然后问if问题

int counter = 0;

for(int i = 0;i<length_of_the_gsl_vector;++i){ 
  if(fabs(gsl_vector_get(y,i))<0.5) ++counter;
}

return counter;
int计数器=0;
对于(inti=0;iGSL实现std::model的人,我读到这样的语句,授权我使用如下内容:

gsl_block vec;
/* initialize ... */
std::valarray<double> a(vec.data, vec.size);
/* use std:: galore */
gsl_块向量;
/*初始化*/
标准::VALA阵列(向量数据,向量大小);
/*使用std::galore*/

您可以通过使用
gsl\u vector\u ptr
获得数据指针,然后在指针上使用
std::count\u(如果
):

struct Predicate{
    inline bool operator()(double x) const {
        return fabs(x) < 0.5 ;
    }
} ;

int res = std::count_if( 
    gsl_vector_ptr(y,0), gsl_vector_ptr(y,0) + size, 
    Predicate()
) ;
struct谓词{
内联布尔运算符()(双x)常量{
返回晶圆厂(x)<0.5;
}
} ;
如果(
gsl_向量_ptr(y,0),gsl_向量_ptr(y,0)+大小,
谓词()
) ;

GSLYVECRTORGET进行索引验证,这将是主要的性能KieleReSt,这就是为什么我想绕过它。我还搜索了从GSLIVector到C++向量的转换,以便我可以使用C++中的CurtTyIF函数,但是还没有成功。一个数组应该真的是可访问的(如它们的状态)使用std::valarray模型。这样的语句授权您使用std::迭代器和std::count_if(如果可能,使用lambda)。我不确定我是否理解您的意思。首先,我如何将gsl_向量转换为数组?第二,如果函数对数组起作用,计数_如何工作?您能举个例子吗?非常感谢。在我的计算机上,我必须使用gel_向量_ptr(y,0),gel_向量_ptr(y,size-1)相反。结果总是比应该的结果少一个。我将使用的时间与我前面介绍的基本方法进行了比较。它们略有不同,基本方法的执行速度快了一点……我已经编辑了答案,正确地使用了
gsl\u vector\u get
。还使用了一个函子来消除取消引用t的问题函数指针。这个版本应该性能更好。不,gsl_vector_get plus if方法仍然稍快。此外,我不知道这里出了什么问题,结果仍然比它应该的少一个计数。当然,我怎么可能忘记gsl中还有另一种称为block的类型。但是,这很尴尬,我不会说这种语言如果你能给我一个像罗曼那样的小代码,那就太好了。