C++ std::size\u t或std::vector::size\u类型?

C++ std::size\u t或std::vector::size\u类型?,c++,stl,c++98,size-t,size-type,C++,Stl,C++98,Size T,Size Type,当我循环std::vector或每个具有随机访问迭代器的容器时,我使用一个无符号整数变量I。如果我想遵守规范,我应该使用std::size\u t还是容器本身给出的类型:std::vector::size\u type 如果出于可读性原因选择std::size\t,我是否可以确保std命名空间中每个容器的每个实现都使用std::size\t作为size\u类型 注意:我使用C++98只是出于兼容性的原因。std::vector::size\u类型与std::size\u类型不一定相同。即使对于C

当我循环std::vector或每个具有随机访问迭代器的容器时,我使用一个无符号整数变量I。如果我想遵守规范,我应该使用std::size\u t还是容器本身给出的类型:std::vector::size\u type

如果出于可读性原因选择std::size\t,我是否可以确保std命名空间中每个容器的每个实现都使用std::size\t作为size\u类型

注意:我使用C++98只是出于兼容性的原因。

std::vector::size\u类型与std::size\u类型不一定相同。即使对于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::vector::size\u类型与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\u类型

不,你不能。但是在实践中,您可以相信std::size_t对于基于单个数组的向量或任何其他容器来说都足够大,因为

size_t可以存储任何类型(包括数组)的理论上可能对象的最大大小

我能否确保std命名空间中每个容器的每个实现都使用std::size\t作为size\u类型

不,你不能。但是在实践中,您可以相信std::size_t对于基于单个数组的向量或任何其他容器来说都足够大,因为

size_t可以存储任何类型(包括数组)的理论上可能对象的最大大小



不,你不能肯定。如果要避免可能的窄化转换,请使用容器提供的类型。一件有趣的事情是,在64位Linux机器上,size_t可以是无符号long的typedef,std::vector::size_type可以是无符号long-long。两者都是64位宽,范围相同,但类型不同。您可以使用一个模板类来选择使用哪种类型,这取决于std::size_t和std::vector::size_type是否具有相同的大小。我现在无法尝试实现它,但我非常确定它是可行的。@NathanOliver:最初,我有这个反射,因为我错误地使用了unsigned long int where ok with gcc,std::size\u t是无符号长整型。现在,我在使用英特尔编译器移植到Windows时遇到了兼容性问题,其中std::size\u t是无符号长整型。:-/不,您不能确定。如果要避免可能的窄化转换,请使用容器提供的类型。一件有趣的事情是,在64位Linux机器上,size_t可以是无符号long的typedef,std::vector::size_type可以是无符号long-long。两者都是64位宽,范围相同,但类型不同。您可以使用一个模板类来选择使用哪种类型,这取决于std::size_t和std::vector::size_type是否具有相同的大小。我现在无法尝试实现它,但我非常确定它是可行的。@NathanOliver:最初,我有这个反射,因为我错误地使用了unsigned long int where ok with gcc,std::size_t是无符号长整型。现在,我在使用英特尔编译器将std::size_t移植到Windows时遇到了兼容性问题,其中std::size_t是无符号长整型。:-/实际上,我已经在boost中使用了静态断言。好主意哇!Boost仍然支持C++98!你知道,它们是很好的鸡蛋。我使用Boost1.57和GCC4.4.7,没有任何已知的问题-实际上,我已经在boost中使用了静态断言。好主意哇!Boost仍然支持C++98!你知道,它们是很好的鸡蛋。我使用Boost1.57和GCC4.4.7,没有任何已知的问题-一个物体的最大尺寸可能比向量的最大尺寸大很多。当T是向量中的值时,std::vector::type的范围仅为0到numeric_limits::max/sizeofT。我要说的是,担心的是可能会缩小转换范围。@StoryTeller如果您的整数太小,无法索引向量的对象,我会担心。std::size\u t至少是它需要的大小,因此它可以表示任何索引。在最坏的情况下,它会浪费一点点内存。如果它太小,您将有无法访问的元素。如果它太大,您将环绕并可能在错误的位置修改图元。我认为其中一个比另一个更容易捕捉。窄带
“转换不仅仅是一种邪恶的行为。@StoryTeller你从哪里得到这个值?”?因为它的大小大于fits-in-size\u-type,所以它不可能成为有效的索引,因此也不可能获得元素。使用size_type并不会使解决bug变得更容易,它只是将换行点移到另一段代码上。它不可能是一个有效的索引。除了C++,将愉快地预成型一个隐式的缩小转换。对于无符号整数,它定义为模2的幂。因此,一个物体的最大尺寸可能比向量的最大尺寸大很多。当T是向量中的值时,std::vector::type的范围仅为0到numeric_limits::max/sizeofT。我要说的是,担心的是可能会缩小转换范围。@StoryTeller如果您的整数太小,无法索引向量的对象,我会担心。std::size\u t至少是它需要的大小,因此它可以表示任何索引。在最坏的情况下,它会浪费一点点内存。如果它太小,您将有无法访问的元素。如果它太大,您将环绕并可能在错误的位置修改图元。我认为其中一个比另一个更容易捕捉。缩小转换的范围不仅仅是一件坏事。@StoryTeller你从哪里得到这个值?因为它的大小大于fits-in-size\u-type,所以它不可能成为有效的索引,因此也不可能获得元素。使用size_type并不会使解决bug变得更容易,它只是将换行点移到另一段代码上。它不可能是一个有效的索引。除了C++,将愉快地预成型一个隐式的缩小转换。对于无符号整数,它定义为模2的幂。因此包装。