让最简单的例子成为可能:
配方1:
std::vector<int> vec;
// add 10E11 elements
for(std::size_t n = 0; n < vec.size(); ++n)
// ...
配方2:
std::vector<int> vec;
// add 10E11 elements
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
// ...
当然,unsigned int
或任何不适当的数据类型在这里都不起作用,我们必须编译x64。我的问题是:是否有任何情况下第一个公式可能导致问题,或者我们安全地总是用这个更短的符号写出来?如果它们很容易覆盖(x86,任何其他容器,size_type
的其他应用程序),我也会对类似的设置感兴趣。
答案 0 :(得分:4)
std::vector
保证指针是整个序列的有效迭代器,因为vector::data
返回&#34;指针使[data(), data() + size())
是有效范围。&#34;该指针的添加是在std::ptrdiff_t
上定义的,std::size_t
是n
的签名版本。
此外,[iterator.requirements.general] / 6适用:
...对于整数值
a
和可解除引用的迭代器值(a + n)
和*(a + n)
,*(addressof(*a) + n)
等同于vector::size_type
......
std::size_t
可能更窄而不是AsynckTask
,例如64位系统上的32位。但这并不是我担心的事情。
答案 1 :(得分:3)
虽然在所有常见实施中都是这种情况,但标准并不保证这一点。保证的是std::vector<T>::size_type
是一个实现定义的无符号整数类型。
参考文献:
23.2.1一般容器要求[container.requirements.general]
X :: size_type [是]无符号 整数类型
和23.3.6.1类模板向量概述[vector.overview]§2
typedef implementation-defined size_type; // see 23.2
答案 2 :(得分:0)
虽然std::vector::size_type
通常为std::size_t
,但无法保证必须这样做。使用
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)