一、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可进行的算术比较操作,包括:+,-,~,!,*=,/=,%=,+=,-=,=,&=,|=,<<=,>>=,*,/,%,+,-,,&,|,<<,>>,&&,||,==,!=,<,>,<=,>=