size_type
而不是int
?如果我们创建自己的结构,是否应该使用size_type
?回答:使用
size_type
可以确保代码在不同平台上具有可移植性,并且可以处理大型容器。因此,建议在自定义数据结构时也使用size_type
。size_type
而不是int
?如果我们创建自己的结构,是否应该使用size_type
?size_type
可以确保代码在不同平台上具有可移植性,并且可以处理大型容器。因此,建议在自定义数据结构时也使用size_type
。size_t
。很奇怪的是,size_t
只需要表示0到SIZE_MAX
字节之间的值,而SIZE_MAX
只需要为65,535,这个限制非常有趣,源自C++和C标准的其他约束如下:
sizeof()
的返回类型是size_t
,并且它是无符号整数operator new()
以size_t
参数形式接收要分配的字节数size_t
在<cstddef>
中被定义SIZE_MAX
在C99中在<limits.h>
中被定义,但在C++98中没有提到?!size_t
未包括在“基本整数类型”列表中,因此我一直认为size_t
是用于基本类型之一的类型别名:char
、short int
、int
和long int
size_t
。如果您正在计算元素数量,则可能应该使用size_t
,因为这似乎是C++一直在使用的。无论如何,您都不应该使用int
——如果必须使用,则至少使用unsigned long
或unsigned long long
(如果使用TR1)。更好的做法是将您最终使用的任何类型定义为size_type
,或只需包含<cstddef>
并使用std::size_t
。以下是可能的几个原因:
如果您只是编写一个只供自己和/或丢弃的应用程序,则可以使用基本的int。如果您正在编写库或类似的重要代码,那么size_t可能是更好的选择。
new char[6 gigs]
,只要你有足够的RAM或交换空间,它就能正常工作。现在,如果你用int类型来管理它,该怎么办呢?这就是size_t
背后的原因。 - v.oddou有些答案比必要的复杂。size_t是一种无符号整数类型,保证足够大以存储内存中任何对象的字节大小。实际上,它的大小总是与指针类型相同。在32位系统上,它为32位。在64位系统上,它为64位。
STL中的所有容器都有各种typedefs。例如,value_type
是元素类型,size_type
是存储数字类型。这样,容器完全基于平台和实现而成为通用的。
如果您正在创建自己的容器,也应该使用size_type
。通常会这样做。
typedef std::size_t size_type;
typedef vector<int> ints;
ints v;
v.push_back(4);
ints::size_type s = v.size();
typedef list<int> ints;
它仍然可以正常工作!
我猜你指的是 "size_t" -- 这是一种表示无符号整数(只能为正数,永远不会为负数)的方式 -- 对于容器的大小来说很有意义,因为你不能有一个大小为 -7 的数组。我不会说你必须使用 size_t,但它确实向使用你的代码的其他人表明“这里的数字总是正数”。它还给你更大范围的正数,但那可能不重要,除非你有一些非常大的容器。
C++是一种可以在不同硬件架构和平台上实现的语言。随着时间的推移,它已经支持了16位、32位和64位架构,未来可能还会支持其他架构。 size_type
和其他类型别名是库为了使程序员/代码与实现细节隔离开来的方式。
假设size_type
在32位机器上使用32位,在64位机器上使用64位,则相同的源代码如果你在需要的地方使用了size_type
,很可能会更好地工作。在大多数情况下,您可以假设它与unsigned int
相同,但不能保证。
size_type
用于表示STL容器(如std::vector
)的容量,而size_t
用于表示C/C++中对象的字节大小。
在规范中,整数的大小不能保证为4个字节,因此它们不可靠。是的,size_type优于ints。
size_t
是无符号的,因此即使它们都是32位,它也不像未经限定的int那样意味着完全相同的事情。我不确定为什么他们添加了这个类型,但在今天的许多平台上,sizeof(size_t)==sizeof(int)==sizeof(long)
,所以你选择哪种类型取决于你自己。请注意,这些关系不被标准保证,并且随着64位平台的发展,它们正在迅速过时。
对于您自己的代码,如果您需要表示某个概念上的“大小”并且永远不可能为负数,那么size_t
将是一个很好的选择。
void f1(size_t n) {
if (n <= myVector.size()) { assert(false); }
size_t n1 = n - myVector.size(); // bug! myVector.size() can be > n
do_stuff_n_times(n1);
}
void f2(int n) {
int n1 = n - static_cast<int>(myVector.size());
assert(n1 >= 0);
do_stuff_n_times(n1);
}
f1()和f2()都有同样的bug,但在f2()中检测问题更容易。对于更复杂的代码,无符号整数算术错误不容易识别。
个人而言,除非需要使用无符号整数,否则我会为所有大小使用有符号整数。我从未遇到过我的大小无法适应32位有符号整数的情况。在使用32位无符号整数之前,我可能会使用64位有符号整数。
使用有符号整数作为大小的问题是你的代码中有很多从size_t
到int
的static_cast
。
assert(n >= myVector.size());
可以完美地检测到错误。 - stefan