`size_t`总是`vector <int> :: size_type`或任何其他容器类型的别名?

时间:2017-01-06 08:32:26

标签: c++ size-type

让最简单的例子成为可能:

配方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的其他应用程序),我也会对类似的设置感兴趣。

3 个答案:

答案 0 :(得分:4)

std::vector保证指针是整个序列的有效迭代器,因为vector::data返回&#34;指针使[data(), data() + size())是有效范围。&#34;该指针的添加是在std::ptrdiff_t上定义的,std::size_tn的签名版本。

此外,[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)