C++ 头文件系列(array)
注意,该头文件仅在C++11中标准才开始出现。
简介
与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性:
- 顺序的(sequence)
- 内存连续的(contiguous storage)
- 固定大小的(fixed-size)
那既然与内置数组一样,为什么还要定义这样一个模版呢?C++委员会是想造轮子吗(-_-)?当然不是!
为什么需要array?
array模版类实际上是内置数组的聚合,外加一层封装。正是由于这层接口,才使得数组能与STL接轨,真正成为一个container。
Container接口
- array::size
- array::back
- array::front
- array::empty
- array::fill
- ...
简单通用的array接口,让数组使用起来更加得心应手。 例如size()成员函数返回数组的大小,在内置数组中则只能查看数组定义或者借助外部函数。
Interator模式接口(姑且让我这么叫吧)
- array::begin
- array::end
- array::cbegin
- array::cend
- array::rbegin
- array::rend
- array::crbegin
- array::crend
解决语法不一致性
Iterator作为C++中沟通Algorithm与Container的桥梁,起着不可或缺的作用。然而内置类型不支持迭代器的概念,虽然对于算法来说有合适的重载能够解决这个问题,但在语法上存在明显的差别(vec为vector,arr为int数组):
for_each(vec.begin(), vec.end(), [](int i)
{
// something
});
for_each(arr, arr + 3, [](int i)
{
// something
});
其实不需要变量定义声明就可以猜到,vec是container而arr不是。 这也许会阻碍代码后期的重构与修改。使用array类模版的话就不会存在这种问题,统一的语法,多棒!
Bound Check
我们都知道,C++沿袭了C语言的设计,在access数组元素时不对数组变量进行边界检查。array解决了这个问题,在元素读写越界时会抛出异常。
差异性
与内置数组的差异
array与内置数组的一个明显的差异就是----允许空数组的定义。
至于为什么要允许这样一个特性,也许是:
- 让空数组保持遍历一致性。
- 让array容器隐式地支持清空(毕竟作为一个fixed-size container,它没有对应的clear操作)。
然而,空数组在语义上是不允许解引用的,因此在使用时规避那些需要解引用的操作。
与其他容器的差异
该方面的差异主要体现在swap成员函数上。就像我们知道的,其他容器调用swap函数时,为了保证高效,该函数实际上执行的操作相当于交换指向实际容器内容的指针。但是array的swap函数却是进行逐成员交换,这也许是为了保持与内置数组相同的性质----数组地址不可变。
出于上述语义上的差别,array与其他容器的迭代器,在swap后会有不同的结果(深色方框代表容器对象, 方框内文字代表容器内容; 箭头代表迭代器变量, 都指向头元素):
swap前:

swap后:

从图上看更为直接:
- array模版类对象只是交换了内容而已,两个迭代器的值都未变。
- 其他容器对象不仅交换了内容,连迭代器的关联性都改变了(实际上,迭代器的值(即关联的内容)也没变,但关联的对象变了)。
Tuple接口
array还提供了一套独特的tuple接口,使其能够像使用元组那样使用。 当然,这种可能性的前提是它本身就非常像元组。
这种特性是通过重载tuple接口的get函数,并且特化tuple_element和tuple_size类模版实现的。
C++ 头文件系列(array)的更多相关文章
- C++ 头文件系列(queue)
简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...
- C++ 头文件系列(vector)
简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...
- C++ 头文件系列(ios)
1 简介 我们都知道,平时常用的那些标准流,诸如iostream.ofstream.ifstream等等,其实都是对应的basic_XXX模版的实例类. 而这些basic_XXX类模版又都是继承自同一 ...
- C++ 头文件系列(stack)
简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...
- C++ 头文件系列(map)
简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性 ...
- C++ 头文件系列(unordered_map、unordered_set)
简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...
- C++ 头文件系列(iterator)
简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...
- C++ 头文件系列 (algorithm)
简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何 ...
- C++ 头文件系列 (bitset)
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...
随机推荐
- Jquery AJAX POST与GET之间的区别
1:GET访问 浏览器 认为 是等幂的就是 一个相同的URL 只有一个结果[相同是指 整个URL字符串完全匹配]所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果 ...
- 【hoj】2651 pie 二分查找
二分查找是一个非常主要的算法,针对的是有序的数列,通过中间值的大小来推断接下来查找的是左半段还是右半段,直到中间值的大小等于要找到的数时或者中间值满足一定的条件就返回,所以当有些问题要求在一定范围内找 ...
- Windows,查看进程的连接的IP地址,批量模式,最后做成Excel
1.CMD -> netstat -ano,复制到UltraEdit 2.把双空格替换为单空格,这种替换要进行很多次,直到全部替换完.其次点20次替换就行了. 3.单空格替换为 ^t,也就是制表 ...
- Fragment 设置主题
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanc ...
- iOS_1_加法器
: BeyondViewController.h // // BeyondViewController.h // 01_calc // // Created by beyond on 14-7-20. ...
- return 使用和闭包
1.return 使用 案例一: var a=1; for(var b=0; b<10; b++){ return b; }; sonsole.log(b)//返回为空 个人认为此处左右与为全局 ...
- [置顶] EasyMock的简单使用
EasyMock总览 下面,我将讲述如何使用JUnit和EasyMock框架来进行单元测试. 在现实情况下,我们通常是在一些类里使用另外的一些类.在进行真正的测试之前,你可能需要做很多的工作,比喻说安 ...
- div高度自适外层div高度随里层div高度自适
尝试过许多办法 其中一网友的最靠谱就是在外层div样式添加两个标签(不能少) clear:both; overflow:auto;
- readonly和const的区别
readonly与const的区别1.const常量在声明的同时必须赋值,readonly在声明时可以不赋值2.readonly只能在声明时或在构造方法中赋值(readonly的成员变量可以根据调用不 ...
- PushSharp的使用
PushSharp的使用 最近做公司的一个项目.一旦数据库插入新的消息,就要通知服务器,将这些新的消息推送给苹果客户端,以前我们的项目中有人做过这个功能,无奈做的有点复杂,而且代码没注释,我压根就没看 ...