STL中的numeric头文件和valarray头文件

一、numeric

STL中的numeric头文件中定义了一组对数值序列执行特定操作的算法。由于这些算法的灵活性,它们也可适用于其他类型的序列。
numeric中的函数包括:
(1)accumulate(),将指定范围内的元素按照给定的函数进行计算,并将这些计算结果累加到给定的初始值上,并返回最终的计算结果,时间复杂度为O(N);
(2)adjacent_difference(),将指定范围内的元素,其中第一个位置将原始元素复制到相应位置,其他位置将其与前一位置的差值复制到相应位置,时间复杂度为O(N);
(3)inner_product(),将指定范围长度相等的两组元素逐个配对,将每对的两个元素相乘,累加到给定的初始值上,并返回最终的计算结果,时间复杂度为O(N);
(4)partial_sum(),将指定范围内的元素,将从第一个元素到当前位置间的所有元素相加,复制到相应位置,时间复杂度为O(N);
(5)iota(),将指定范围内的元素,其第一个元素为给定的初始值,其余位置为初始值+位置偏移值,时间复杂度为O(N)。

二、valarray
STL中的valarray头文件中定义了一组用于数值值数组的类和辅助函数。
其中定义的类包括:
1.valarray类:
其被设计用来保存一个数值数组,使其可以轻松地执行数学运算,并允许特殊机制引用数组中的元素子集。包括算术和比较运算的操作都可直接应用于该类上。该类进行了并行化、内存回收、引用复制等优化,从而提高了操作效率,前提是其行为方式是valarray对象,并且可以转换为valarray对象。
其模板类定义为:
template class valarray;
其成员函数包括:
(1)(constructor),构造器;
(2)(destructor),销毁器;
(3)valarray operators,算术操作,具体操作功能在后面详述;
(4)apply(),对容器内的每个元素,使用给定的函数进行计算,并将结果返回为一新容器,时间效率上要优于一般的顺序容器;
示例代码为:

#include <iostream>     // std::cout
#include <cstddef>      // std::size_t
#include <valarray>     // std::valarray

int increment (int x) {return ++x;}

int main ()
{
    int init[]={10,20,30,40,50};
    std::valarray<int> foo (init,5);
    std::valarray<int> bar = foo.apply(increment);
    std::cout << "foo contains:";
    for (std::size_t n=0; n<bar.size(); n++)
	std::cout << ' ' << bar[n];
    std::cout << '\n';
    return 0;
}

(5)cshift(),返回将容器内所有元素循环左移指定个数后的新容器,之前在最左侧的元素会移动到容器的后端;
(6)max(),返回容器内所有元素中的最大值;
(7)min(),返回容器内所有元素中的最大值;
(8)operator=,复制构造函数;
(9)operator[],按下标或下标划片(通过std::slice()实现)来访问容器中的元素;
(10)resize(),调整容器的元素个数为指定值,并使用给定值给所有元素赋值;
(11)shift(),将容器内的所有元素左移或右移指定索引,该平移不改变容器中元素的个数,且不进行循环平移,因此,移出范围的原元素被删除,之前未覆盖位置的值用0值填充;
(12)size(),返回容器中元素的个数;
(13)sum(),返回容器中所有元素的总和;
(14)swap(),交换两个容器中的所有元素。

2.slice类:
其表示valarray对象元素的切片选择器,它不包含也不引用任何元素,只描述要在valarray::operator[]中用作索引的元素选择。一个slice由起始索引值,个数,步长,3个值来定义。
其模板类定义为:
class slice;
其成员函数包括:
(1)(constructor),构造器;
(2)start(),返回slice的起始索引值;
(3)size(),返回slice的元素个数;
(4)stride(),返回slice的元素间步长。
示例代码为:

#include <iostream>     // std::cout
#include <cstddef>      // std::size_t
#include <valarray>     // std::valarray, std::slice

int main ()
{
    std::valarray<int> foo (10);
    for (int i=0; i<10; ++i) foo[i]=i;
    std::slice slc (0,5,2);
    std::valarray<int> bar = foo[slc];
    std::cout << "slice with a stride of " << slc.stride() << ":\n";
    for (std::size_t n=0; n<bar.size(); n++)
	std::cout << bar[n] << ' ';
    std::cout << '\n';
    return 0;
}

3.gslice类:
其表示valarray对象元素的切片选择器(多维的),它不包含也不引用任何元素,只描述要在valarray::operator[]中用作索引的元素选择。一个gslice由起始索引值的set,个数的set,步长的set,3组值来定义。
其模板类定义为:
class gslice;
其成员函数包括:
(1)(constructor),构造器;
(2)start(),返回slice的起始索引值;
(3)size(),返回slice的元素个数;
(4)stride(),返回slice的元素间步长。
示例代码为:

#include <iostream>     // std::cout
#include <cstddef>      // std::size_t
#include <valarray>     // std::valarray, std::gslice

int main ()
{
    std::valarray<int> foo (14);
    for (int i=0; i<14; ++i) foo[i]=i;
    std::size_t start=1;
    std::size_t lengths[]= {2,3};
    std::size_t strides[]= {7,2};
    std::gslice mygslice (start, std::valarray<std::size_t>(lengths,2), std::valarray<std::size_t>(strides,2));
    std::valarray<int> bar = foo[mygslice];
    std::cout << "gslice:";
    for (std::size_t n=0; n<bar.size(); n++)
	    std::cout << ' ' << bar[n];
    std::cout << '\n';
    return 0;
}

其中通用的函数包括:
(1)abs(),返回由原valarray中所有元素的绝对值组成的新valarray;
(2)acos(),返回由原valarray中所有元素的反余弦值组成的新valarray;
(3)asin(),返回由原valarray中所有元素的反正弦值组成的新valarray;
(4)atan(),返回由原valarray中所有元素的反正切值组成的新valarray;
(5)atan2(),返回由原valarray中所有元素和单个给定值,或者由单个给定值和valarray中所有元素,或者由2个valarray中所有元素分别计算的反正切值组成的新valarray;
(6)cos(),返回由原valarray中所有元素的余弦值组成的新valarray;
(7)cosh(),返回由原valarray中所有元素的余割值组成的新valarray;
(8)exp(),返回由原valarray中所有元素的指数值组成的新valarray;
(9)log(),返回由原valarray中所有元素的自然对数值组成的新valarray;
(10)log10(),返回由原valarray中所有元素的以10为底的自然对数值组成的新valarray;
(11)pow(),返回由原valarray中所有元素的幂值组成的新valarray;
(12)sin(),返回由原valarray中所有元素的正弦值组成的新valarray;
(13)sinh(),返回由原valarray中所有元素的正割值组成的新valarray;
(14)sqrt(),返回由原valarray中所有元素的平方根值组成的新valarray;
(15)tan(),返回由原valarray中所有元素的正切值组成的新valarray;
(16)tanh(),返回由原valarray中所有元素的双曲正切值组成的新valarray;
(17)valarray operators,valarray可进行的算术比较操作,包括:+,-,~,!,*=,/=,%=,+=,-=,=,&=,|=,<<=,>>=,*,/,%,+,-,,&,|,<<,>>,&&,||,==,!=,<,>,<=,>=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值