c – 循环中的Stroustrup和overflow_type溢出

我正在阅读Bjarne Stroustrup的“使用C编程原则和实践”,我需要澄清一下我在第25.5.3节中找到的令人惊讶的一点.作者声称,如果我们想迭代一个std :: vector,那么使用一个循环变量
for (vector<int>::size_type i = 0; i < v.size(); ++i)

比使用vector类的迭代器更不安全:

for (vector<int>::iterator p = v.begin(); p != v.end(); ++p)

因为,是一个无符号类型,我可能会溢出.他声明使用迭代器的循环没有这样的限制.我有点困惑,因为我了解到size_type保证足够大以表示最大可能的向量,因此size_type类型的变量永远不会在这样的循环中溢出.

编辑

更具体地说,他提出了一个使用类型为int的循环变量的示例,然后在最后他说:

“size_type保证是无符号的,所以第一个(无符号整数)形式比上面的int版本多一个位.这可能很重要,但它仍然只给出一个范围的位数(迭代次数加倍)可以做到的.使用迭代器的循环没有这样的限制.“

不是vector< T> :: size()返回一个向量< T> :: size_type?我没有看到任何限制.

解决方法

嗯,是的,你引用的段落确实暗示或暗示size_type可能有问题.但我不认为这是作者的意图.

注意前一段说的(重新:第二版)

So,technically,most of the loops in this book have been sloppy […]. To avoid this problem we can use the size_type provided by vector,iterators,or a range-for-statement:

在本段中,size_type是针对本书前几节中使用的可能有问题的int循环的解决方案.它被提及作为一个安全的替代方案与迭代器或范围的循环版本.

当有人试图使用std :: size_t来计算或索引非基于数组的容器的元素时,确实存在潜在的溢出(或范围不足)问题,例如std :: list,std :: deque,std :: map等,而不是使用容器自己的size_type.但这是一个略有不同的故事,即使它是相关的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...