August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
大多数实际程序都需要处理数据集合,即,会用各种类型的数据元素的表格、列表等来完成某项任务。在C++语言中,我们一般把“数据集合”称为容器(container)。最常用的标准库容器是4.6节中介绍的vector。一个vector中包含了一组数据。我们可以通过vector的成员函数size()来获得数据的个数。如果我们引用了一个不在有效范围[0:v.size())内的下标的话,会出现什么情况呢?需要注意的是[low:high)表示从low到high-1的下标范围,它包括low但不包括high:
在回答上面的问题前,我们先看看另外一个问题和它的答案:
“为什么要这么做呢?”毕竟,你应该明白下标只能在范围[0:v.size())内,因此确保如此就可以了呀!
话虽然是这么说的,但是实际上,很难保证这种情况不会发生。看看下面这个似乎合理的程序:
你看出问题了么?试着把它识别出来。这不是一个一般性的错误。这种错误往往是由我们自身的原因导致,特别是在工作到很晚我们很累的时候。当我们很劳累或者很毛躁的时候,这类错误经常会出现。在我们对v[i]进行操作时候,我们用0和size()来保证i总是在合法的范围内。
不幸的是,我们犯了一个错误。仔细看看for循环:它的终止条件是i<=v.size()而不是i<v.size()。这会导致一个不幸的结果:如果我们读入了5个整数,它会试图输出6个结果。因为我们试图读v[5]的值,而它已经超出了vector的存储空间范围。这类错误是非常普遍的而且很“出名”,人们为它起了很多名字:偏一位错误(off-by-one ...