当我循环std::vector<Foo>
(或每个具有随机访问迭代器的容器)时,我使用无符号整数变量i
。如果我想尊重规范,我应该使用std::size_t
还是容器本身给出的类型:std::vector<Foo>::size_type
?
如果我选择std::size_t
(出于可读性原因),我是否可以确定std
命名空间中每个容器的每个实现使用std::size_t
作为size_type
?
注意:我仅使用C ++ 98(出于兼容性原因)。
答案 0 :(得分:4)
std::vector<Foo>::size_type
与std::size_t
相同,必然为真。即使对于C ++ 11也是如此。
但我个人使用std::size_t
作为std::vector
索引而不论其类型。
如果你感觉特别勤奋,你总是可以使用静态断言。显然static_assert
是C ++ 98中的后续版本,但在该标准中你可以使用类似
static char wrong_size_1[1 + sizeof(std::size_t) - sizeof(std::vector<Foo>::size_type)];
static char wrong_size_2[1 - sizeof(std::size_t) + sizeof(std::vector<Foo>::size_type)];
如果类型类型的大小不同,会导致编译时失败。
答案 1 :(得分:2)
不,你不能。但是在实践中,您可以相信我可以确定std命名空间中每个容器的每个实现都使用
std::size_t
作为size_type
吗?
std::size_t
对于矢量或基于单个数组的任何其他容器来说足够大,因为
size_t
可以存储任何类型(包括数组)理论上可能的对象的最大大小。