16.7.1 vector、valarray和array
vector、valarray和array这三个类模板是由不同的小组开发的,用于不同的目的:
- vector模板类:
- 它是一个容器类和算法系统的一部分,支持面向容器的操作,如排序、插入、重新排列、搜索
- 将数据转移到其它容器中等。
- valarray模板类:
- 它面向数值计算,不是STL的一部分, 如:
- 无 push_back( )和 insert( ) 方法
- ### 但是它为许多数学运算提供了简单、直观的接口
- ### 该类重载了所有算数运算符,使其能用于valarray对象
- ### 该类重载了许多数学函数,使之能用于valarray对象(将其作为参数,如log( valarray_object )):
- ### vad3 = log(vad1); // log( ) overloaded
- ### 也可以使用apply( )方法,该方法也适用于非重载函数:
- ### vad3 = vad1.apply(log);
- ### 方法apply( )不修改调用对象,而是返回一个包含结果的新对象
- valarray类还提供了许多方法:
- sum( ):计算valarray对象中所有元素的和
- size( ):返回元素数
- max( ):返回最大的元素值
- min( ):返回最小的元素值
- ### 对于数学运算而言,valarray类提供了比vector更清晰的表示方式,但通用性更低。valarray确实有一个resize( )方法,但不能像使用vector
- ### 的push_back是那样自动调整大小。没有支持插入、排序、搜索等操作的方法。
- ### 总之,与vector类相比,valrray类关注的东西更少,但这使得它的接口更简单
- 不完全支持STL功能:
- 没有begin( ) 和 end( )方法,故不支持sort( )函数
- 而且未定义下标超过尾部一个元素的行为(可行),存在操作风险
- ### C++11提供了接受valarray对象作为参数的模板函数begin( ) 和 end( ),这些函数返回的值
- ### 满足STL区间需求
- 其它特性:
- 如果numbers是一个valarray<double>对象,则下面的语句将创建一个bool数组,其中vbool[i]被设置为number[i] > 9的值:此时
- valarray<bool> vbool = numbers > 9;
2.扩展的下标指定版本:slice类——此时用作数组索引,表示一组值
- 被初始化为三个整数值:起始索引、索引数、跨距
- 起始索引:第一个被选中的元素的索引
- 索引数:指出选择多少个元素
- 跨距:元素之间的间隔
- 用于valarray对象的下标替代(指定多个下标): varint[slice(1, 4, 3)] = 10; // set selected elements to 10
- ### 对于slice下标指定的valarray单元没有定义各种运算符,因此执行计算时须将其再转换为完整的valarray模型
- ### valarray类提供了用于这种目的的构造函数。
- 如果numbers是一个valarray<double>对象,则下面的语句将创建一个bool数组,其中vbool[i]被设置为number[i] > 9的值:此时
- 它面向数值计算,不是STL的一部分, 如:
- array模板类:
- 用于替代内置数组
- 通过提供更好、更安全的接口,让数组更紧凑,效率更高
- 它表示长度固定的数组,因此不支持push_back( ) 和 insert( )
- ### 由于提供了多个STL方法,包括:
- begin( )
- end( )
- rbegin( )
- rend( )
- ### 这使得容易将STL算法用于array对象