CppPrimer代码评述1-Ch3_arrayScores-迭代器遍历
新坑是代码评述系列, 评述写在注释里, 非常主观非常粗俗, 但可能可以给我带来一点安慰, 感觉自己好勤奋的样子.
碎碎念1-C++迭代器到底要实现什么?好在哪里?
这边先简单提一下C++的迭代器, 我们知道C++一共有5种(甚至更多?)种迭代器, 具体请看这里, 但是归根结底, 在实现”遍历”这个事情上, 我们需要的迭代器只要能够实现这两点就足够贴心了:
- 通用接口:
- 对所有容器类与”类似容器类的类型”(比如String类型), 提供相似的接口(目前的实现, 就是T.begin(), T.end()两个成员函数)
- 对原生数组提供与容器类尽可能相似的操作.
- 防越界:
- 利用边界条件实现”迭代终止”的判断, 而不是依靠程序员自己判断
目前存在的问题是, 因为数组显然不是类型类, 所以不可能有T.begin(), T.end()这样的成员函数, 但是我们还是希望实现一个通用接口, 于是我们使用<iterator>里面的cbegin和cend两个成员函数, 他们接受数组并返回头尾指针(并且由于加c所以还是个常量, 省的以后多事), 如此一来, 我们就能够实现: 完完全全使用”迭代器”(或类似迭代器的”迭代指针常量”)进行遍历这一宏伟目标了, 我觉得有点像”百代皆从秦制”那种美感, 具体请看这里
- 利用边界条件实现”迭代终止”的判断, 而不是依靠程序员自己判断
碎碎念2-符号记法中的一些玄机
这边再扯一点关于一些符号记法的东西, 首先我们知道每一种语言它的记号都是有一定区别的, 但是在这些区别中也是有通用的记法(或者干脆叫做”创造者们的一种默契”好了^_^), 这些通用的记法比如说都使用[]作为数组索引的算子; 不同的东西我们可以认为是某种特定的”Style风格”, 比如同样是定义普通数组, C/C++喜欢中置括号(C sytle), 而Java喜欢把括号提前(Java style), 这里面也大有玄机:
我猜测, 因为我们知道Java不像C++, 天天要拖着C这个弟弟然后无限纵容(兼容), 所以很快就走向了”容器”+”切面”这样的编程模式了(这也是为什么后面会形成那么多的编程范式的原因之一), 也就是”容器”这个更抽象的概念与思想很可能是Java先广泛运用的, 比如 Int[], 很可能就体现出来一个”容器”的雏形, 因为这种写法就意味着Int[]与Int两个概念的分离, {“整型指针”, “整型数组”}是容器一类, {“整型”}是元素一类, 他们之间概念的差异被Java发扬出来, 这是一个体现.
我猜测,为什么C语言一开始定义数组使用中置括号, 可能与”内存操作”的印象有关, 因为本身”数组”的应用天生就与”遍历”分不开(sizeof我们都知道是”编译期决定”的, 所以也不能帮忙对数组长短进行控制), 然而从内存视角而言Int数组和Int差别其实不是很大(他们的指针都只能指向一个块块), 因此他们认为Int Array就是Int, 只是需要对后面的若干块进行管理, 这种想法很自然就不会将[]剃刀变量前面, 因为以这种内存观点来看, []提前反而是一种误解了, 认为这个指针指向另一个数组指针了.
碎碎念3-关于逗号与分号的使用分析
代码后半部分注释进行了探讨, 在此不做过多说明.
代码评述
|