Val*_*rio 6 c++ iterator size-type
我正在阅读Bjarne Stroustrup撰写的"使用C++编程原理和实践",我需要澄清一下我在第25.5.3节中找到的令人惊讶的一点.作者声称,如果我们想迭代一个std::vector,那么使用一个循环变量
for (vector<int>::size_type i = 0; i < v.size(); ++i)
Run Code Online (Sandbox Code Playgroud)
比使用vector类的迭代器安全性更低:
for (vector<int>::iterator p = v.begin(); p != v.end(); ++p)
Run Code Online (Sandbox Code Playgroud)
因为,是无符号类型,i可能会溢出.他声明使用迭代器的循环没有这样的限制.我有点困惑,因为我知道size_type保证足够大以代表最大可能的向量,所以类型的变量size_type永远不会在这样的循环中溢出.
编辑
更具体地说,他提出了一个int在其他两个之前使用类型的循环变量的示例,然后在最后他说:
" size_type保证是无符号的,所以第一个(无符号整数)形式比int上面的版本多一个比特.这可能很重要,但它仍然只给出一个比特的范围(加倍迭代次数)使用迭代器的循环没有这样的限制."
不vector<T>::size()归还vector<T>::size_type?我没有看到任何限制.
嗯,是的,您引用的段落似乎确实暗示或暗示size_type可能存在问题.但我不认为这是作者的意图.
注意前一段说的(重新:第二版)
因此,从技术上讲,本书中的大部分循环都是草率的[...].为了避免这个问题,我们可以使用
size_type提供的vector,迭代器或forrange -- statement:
本段size_type提供了本书前几节中使用的潜在问题循环的解决方案int.它被提及作为一个安全的替代品一起使用迭代或循环的范围,对于版本.
当有人试图使用的潜在溢出(或范围不足)的问题确实存在std::size_t进行计数或一个非基于阵列的容器,如索引元素std::list,std::deque,std::map等等,,而不是使用容器自身size_type.但这是一个略有不同的故事,即使它是相关的.