16.7.1 vector、valarray和array

vector、valarray和array这三个类模板是由不同的小组开发的,用于不同的目的:

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