C++有3种数组,vector,valarray,array
1.vector:是容器,优势是支持面向容器的操作和算法
2.valarray:是一个类模板,面向数值计算,优势是重载了各种数学函数,方便数学计算
3.array:其实是C数组,固定长度,但是提供了STL算法,比如begin(),end()等,优势是特定的需要固定长度数组的场景
valarray的数学优势:例如,需要计算每个元素的对数,vector会这样实现:
vector<double>v1(10);
vector<double>v2(10);
transform(v1.begin(), v1.end(), v2, log);
而使用valarray可以直接如下实现:
valarray<double>v1(10);
valarray<double>v2(10);
v2 = log(v1);
vector的优势是提供了Insert、push_back等方法,并且支持插入、排序、搜索等操作,这些都是valarray不支持的,因为valarray不提供begin和end,valarray对象也不是指针,不能用如下方式:
valarray<double>v1(10);
sort(v1, v1 + 10); //invalid
唯一可用的是如下方式:
valarray<double>v(10);
sort(&v[0], &v[10]);
但是注意,valarray不是C数组,对于C数组,越界是访问最后一个元素后面的地址,但是valarray没定义这种情况下的行为,可能造成一个指向堆的内存的指针,sort一直运行,踩到堆上,因此不要这样做。
slice类:其对象用作数组索引,例如slice(0, 4, 3)表示第0,、3、6、9个元素,使用方法:
valarray<int>t(100;
t[slice(0, 4, 3)] = 1;
表示将0、3、6、9这4个元素的值设置为1。注意对t[slice(0, 4, 3)]没有加法运算,使用的时候需要创建匿名对象,如下:
valarray<int>v(10);
v[slice[0, 4, 3)] = valarray<int>(v[slice(1, 4, 2)]) + valarray<int>(v[slice(5, 4, 1)]);