"size_t"是否始终是"vector<int>::size_type"或任何其他容器类型的别名?

Is `size_t` always an alias for `vector<int>::size_type` or any other container type?

本文关键字:size 其他 任何 别名 类型 int 是否 gt lt vector type      更新时间:2023-10-16

让我们做一个最简单的例子:

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

>std::vector保证指针是其整个序列的有效迭代器,因为vector::data返回"一个指针,使得[data(), data() + size())是一个有效的范围"。这是指针加法,它是在std::ptrdiff_t上定义的,这是std::size_t的有符号版本。

此外,[iterator.requirements.general]/6 也适用:

。对于整数值n和可取消引用迭代器值a(a + n)*(a + n)等价于*(addressof(*a) + n) ...

vector::size_type可能比std::size_t窄,例如在64位系统上为32位。但这不是我会担心的事情。

尽管在所有常见的实现中都是这种情况,但该标准对此没有保证。可以保证的是,std::vector<T>::size_type是定义的无符号整数类型的实现。

引用:

23.2.1 一般容器要求 [容器.要求.一般]

X::size_type [是] 无符号 整数类型

和 23.3.6.1 类模板向量概述 [向量概述] §2

typedef implementation-defined size_type; // see 23.2

虽然std::vector::size_type通常是std::size_t,但不能保证它必须。使用更安全

for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
相关文章: