std :: size_t或std :: vector :: size_type?

问题描述:

当我在std::vector<Foo>(或每个具有随机访问迭代器的容器)上循环时,我使用无符号整数变量i。如果我想尊重规范,我应该使用std::size_t还是容器本身给出的类型:std::vector<Foo>::size_typestd :: size_t或std :: vector <Foo> :: size_type?

如果我选择std::size_t(可读性原因),我可以肯定的是,在std命名空间的每个容器的每一个实现使用std::size_tsize_type

注:我仅使用C++ 98(出于兼容性原因)。

+1

不,你不能确定。如果您想避免可能的缩小转换,请使用容器提供的类型。 – StoryTeller

+0

一个有趣的事情是'size_t'可以是'unsigned long'的typedef,'std :: vector :: size_type'可以是64位Linux机器上的'unsigned long long'。两者都是64位宽,并具有相同的范围,但它们不是同一类型。 ([example](http://coliru.stacked-crooked.com/a/06c88c51b0cf219b)) – NathanOliver

+0

您可以使用一个模板类,根据是否使用“std :: size_t”和“ 'std :: vector :: size_type''具有相同的大小(我现在不能尝试实现它,但我确定它是可行的)。 – nefas

这不是必然确实std::vector<Foo>::size_typestd::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)]; 

这将导致编译时失败,如果类型的类型是不一样的尺寸。

+0

其实,我已经使用静态断言和boost。好主意 ! – Caduchon

+0

哇。 Boost仍然支持C++ 98!你知道,他们是好蛋。 – Bathsheba

+0

我对GCC 4.4.7使用boost 1.57,没有任何(已知)问题。 ;-) – Caduchon

我可以肯定的是,在std名字空间的每个容器的每一个实现使用std::size_tsize_type

不,你不能。然而,在实践中,可以相信,std::size_t为载体或任何其他的容器足够大基于单一阵列上因为

size_t可以存储任何类型(包括数组)的理论上可能的物体的最大尺寸。

+0

一个对象的最大尺寸可能不止是矢量的最大尺寸类型。当'T'是向量中的东西时,'std :: vector :: type'的范围只有0到'numeric_limits :: max()/ sizeof(T)'。担心的是我想说可能会缩小转换范围。 – StoryTeller

+0

@StoryTeller我担心,如果你的整数太小,索引矢量的对象。 'std :: size_t'至少和它需要的一样大,所以它可以表示任何索引。最糟糕的是它浪费了一点点的记忆。 – user2079303

+1

如果它太小,你将有无法达到的元素。如果它太大,你会“环绕”,并可能在错误的地方修改元素。我认为一个比另一个更容易被捕获。缩小转换不仅仅是一件坏事。 – StoryTeller