std :: size_t或std :: vector :: size_type?
当我在std::vector<Foo>
(或每个具有随机访问迭代器的容器)上循环时,我使用无符号整数变量i
。如果我想尊重规范,我应该使用std::size_t
还是容器本身给出的类型:std::vector<Foo>::size_type
?std :: size_t或std :: vector <Foo> :: size_type?
如果我选择std::size_t
(可读性原因),我可以肯定的是,在std
命名空间的每个容器的每一个实现使用std::size_t
为size_type
?
注:我仅使用C++ 98(出于兼容性原因)。
这不是必然确实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)];
这将导致编译时失败,如果类型的类型是不一样的尺寸。
我可以肯定的是,在std名字空间的每个容器的每一个实现使用
std::size_t
为size_type
?
不,你不能。然而,在实践中,可以相信,std::size_t
为载体或任何其他的容器足够大基于单一阵列上因为
size_t
可以存储任何类型(包括数组)的理论上可能的物体的最大尺寸。
一个对象的最大尺寸可能不止是矢量的最大尺寸类型。当'T'是向量中的东西时,'std :: vector :: type'的范围只有0到'numeric_limits
@StoryTeller我担心,如果你的整数太小,索引矢量的对象。 'std :: size_t'至少和它需要的一样大,所以它可以表示任何索引。最糟糕的是它浪费了一点点的记忆。 – user2079303
如果它太小,你将有无法达到的元素。如果它太大,你会“环绕”,并可能在错误的地方修改元素。我认为一个比另一个更容易被捕获。缩小转换不仅仅是一件坏事。 – StoryTeller
不,你不能确定。如果您想避免可能的缩小转换,请使用容器提供的类型。 – StoryTeller
一个有趣的事情是'size_t'可以是'unsigned long'的typedef,'std :: vector :: size_type'可以是64位Linux机器上的'unsigned long long'。两者都是64位宽,并具有相同的范围,但它们不是同一类型。 ([example](http://coliru.stacked-crooked.com/a/06c88c51b0cf219b)) – NathanOliver
您可以使用一个模板类,根据是否使用“std :: size_t”和“ 'std :: vector :: size_type''具有相同的大小(我现在不能尝试实现它,但我确定它是可行的)。 –
nefas