9.2.1 迭代器范围
注解:迭代器范围这个概念是标准库的基础。
C++语言使用一对迭代器标记迭代器范围(iterator range),这两个迭代器分别指向同一个容器中的两个元素或超出末端的下一个位置,通常将他们命名为first和last,或beg和end,用于标记容器中的一段元素范围。
尽管last和end这两个名字很常见,但是它们却容易引起误解。其实第二个迭代器从来都不是指向元素范围的最后一个元素,而是指向最后一个元素的下一个 位置。该范围内的元素包括迭代器first指向的元素,以及从first开始一直到迭代器last指向的位置之前的所有元素。如果两个迭代器相等,则迭代 器范围为空。
此类元素范围称为左闭合区间(left-inclusive interval),其标准表示方式为:
// to be read as:includes first and each element up to but not //including last
[first,last)
表示范围从first开始,到last结束,但不包括last。迭代器last可以等于first,或者指向first标记的元素后面的某个元素,但绝对不能指向first标记的元素前面的元素。
对形成迭代器范围的迭代器的要求
迭代器first和last如果满足以下条件,则可以形成一个迭代器范围:
- 它们指向同一个容器中的元素或超出末端的下一位置
- 如果这两个迭代器不相等,则对first反复做自增运算必须能够到达last。换句话说,在容器中,last绝对不能位于first之前。
使用左闭合区间的编程意义
因为左闭合区间有两个方便使用的性质,所以标准库使用此类区间。假设first和last标记了一个有效的迭代器范围,于是:
(1)当first与last相等时,迭代器范围为空;
(2)当first与last不相等时,迭代器范围内至少有一个元素,而且first指向该区间中的第一个元素。此外,通过若干次自增运算可以使first的值不断增大,直到first=last为止。
这两个性质意谓着程序员可以安全地编写如下的循环,通过测试迭代器处理一段元素:
while (first != last)
{
// safe to use *first because we know there is at least one element
++first;
}
假设first和last标记了一段有效的迭代器范围,于是我们知道要么first=last,这是退出循环的情况;要么该区间非空,first指向其第 一个元素。因为while循环条件处理了空区间情况,所以对此无须再特别处理。当迭代器范围非空时,循环至少执行一次。由于循环体每次循环就给first 加1,因此循环必定会终止。而且在循环内可确保*first是安全的;它必然指向first和last之间非空区间内的某个特定元素。
PS:摘自《C++Primer中文版(第四版)》,我为什么写这些呢?第一:这是一本经典书籍,仔细读,会有很多收获;第二:为了检查一下我新安装的搜狐拼音输入法3.0公测第一版是否好用。
没有评论:
发表评论