vector
- 如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。(范围for语句体内不应改变其所遍历序列的大小)。
- 试图用下标的形式去访问一个不存在的元素将引发错误,不过这种错误不会被编译器发现,而是在运行时产生一个不可预知的值。不幸的是,这种通过下标访问不存在的元素的行为非常常见,而且会产生很严重的后果。所谓的缓冲区溢出(buffer overflow)指的就是这类错误,这也是导致PC及其他设备上应用程序出现安全问题的一个重要原因。
确保下标合法的一种有效手段就是尽可能使用范围for语句。
- 原来使用C或Java的程序员在转而使用C++语言之后,会对for循环中使用!=而非<进行判断有点儿奇怪,比如上面的这个程序以及85页的那个。C++程序员习惯性地使用!=,其原因和他们更愿意使用迭代器而非下标的原因一样:因为这种编程风格在标准库提供的所有容器上都有效。之前已经说过,只有string和vector等一些标准库类型有下标运算符,而并非全都如此。与之类似,
所有标准库容器的迭代器都定义了==和!=,但是它们中的大多数都没有定义<运算符。
因此,只要我们养成使用迭代器和!=的习惯,就不用太在意用的到底是哪种容器类型。 - 不能在范围for循环中向vector对象添加元素。另外一个限制是任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
数组
- 数组不是类类型。
- 定义数组的时候必须指定数组的类型,不允许使用auto关键字由初始值的列表推断类型。另外和vector一样,数组的元素应为对象,因此不存在引用的数组。
- 如果p是空指针,允许给p加上或减去一个值为0的整型常量表达式。两个空指针也允许彼此相减,结果当然是0。
- 标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求。
- p114,最后一段不懂。ia不就是int *吗?为什么可以row:ia,而row是int*,