其他库介绍
C++提供了三个数组模板: vector, valarray和array
vector: 是一个容器类和算法系统的一部分, 支持面向容器的操作, 如:排序, 插入, 重新排列, 搜索, 将数据转移到其他容器中等.
valarray类模板: 是面向数值计算的. 不是STL的一部分, 但提供了很多数学运算的简便接口
array: 是为了代替内置数组设计的, 它提供更好, 更安全的接口, 让数组更紧凑, 效率更高. array表示长度固定的数组, 因此不支持push_back() 和 insert(), 但提供了多个STL方法, begin(), end(), rbegin(), rend()等.
假如, 有如下声明:
vector<double> vet1(10), vet2(10), vet3(10);
array<double> arr1(10), arr2(10), arr3(10);
valarray<double> val1(10), val2(10), val3(10);
如果我们要实现将前两个数组的对应元素的和赋给第三个数组的对应元素, 我们可以这么写:
transform(vet1.begin(), vet1.end(), vet2.begin(), vet3.begin(), plus<double>())
对于array:
transform(arr1.begin(), arr1.end(), arr2.begin(), arr3.begin(), plus<double>())
然而对于valarray类, 它重载了所有算数运算符, 使其能够用于valarray对象, 所以可以这么做:
val3 = val1 + val2;
// 同样, 如果我们要得到前两个数组中对应元素的乘积:
val3 = val1 * val2;
要将数组中每个元素的值扩大2.5倍, STL方法如下:
transform(val3.begin(), val3.end(), bindl1st(multiplies<double>(), 2.5));
同样, 有更简便的表达方法:
val3 = 2.5 * val3;
val3 *= 2.5;
假设我们要计算数组中每个元素的自然对数, 并将计算结果存储到另一个数组的相应的元素中, STL方法如下:
transform(vet1.begin(), vet1.end(), vet3.begin(), log);
但对于valarray类重载了这些数学函数, 因此可以直接这么做: