为什么在C ++容器中,它返回size_type
而不是int
?如果我们正在创建自己的结构,我们是否也应该鼓励使用size_type
?
答案 0 :(得分:26)
通常,只要您测量某物的大小,就应该使用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
是其中一种基本类型的类型别名:{{1 },char
,short int
和int
。如果要计算字节数,那么你肯定应该使用long int
。如果你在计算元素的数量,那么你应该使用size_t
,因为这似乎是C ++一直在使用的。在任何情况下,您都不想使用size_t
- 如果您使用TR1,则至少使用int
或unsigned long
。或者......更好...... unsigned long long
无论您最终使用typedef
还是仅包含size_type
并使用<cstddef>
。
答案 1 :(得分:9)
可能有以下几个原因:
如果您正在编写一个仅适合您和/或一次性使用的应用程序,那么使用基本的int可能很好。如果你正在编写一个库或一些实质性的东西,size_t可能是一个更好的方法。
答案 2 :(得分:5)
有些答案比必要的要复杂得多。 size_t是无符号整数类型,保证大到足以存储内存中任何对象的字节大小。实际上,它总是与指针类型相同。在32位系统上,它是32位。在64位系统上,它是64位。
答案 3 :(得分:2)
stl中的所有容器都有各种typedef。例如,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更改为
即可typedef list<int> ints;
它仍然可以使用!
答案 4 :(得分:1)
我假设你的意思是“size_t” - 这是一种表示无符号整数的方法(一个只能是正整数,从不为负数的整数) - 它对容器的大小有意义,因为你不能有一个数组大小为-7。我不会说你必须使用size_t,但它确实向其他人使用你的代码表明“这里的数字总是正面的。”它还为您提供了更大范围的正数,但除非您有一些非常大的容器,否则这可能并不重要。
答案 5 :(得分:1)
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 ++中对象的字节大小。
答案 6 :(得分:0)
ints不保证在规范中是4个字节,因此它们不可靠。是的,size_type比首选
更受欢迎答案 7 :(得分:0)
size_t
是无符号的,所以即使它们都是32位,它也不代表与非限定int完全相同的东西。我不确定为什么他们添加了类型,但在今天的许多平台sizeof (size_t) == sizeof (int) == sizeof (long)
上,您选择哪种类型取决于您。请注意,这些关系不受标准保证,并且随着64位平台的推移而迅速变得过时。
对于您自己的代码,如果您需要在概念上代表某个“大小”且永远不会消极的内容,size_t
将是一个不错的选择。
答案 8 :(得分:-5)
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()都有相同的错误,但检测f2()中的问题更容易。对于更复杂的代码,无符号整数算术错误并不容易识别。
我个人使用signed int来表示我的所有大小,除非使用unsigned int。我从来没有碰到我的大小不适合32位有符号整数的情况。在使用无符号32位整数之前,我可能会使用64位有符号整数。
在代码中使用有符号整数的大小问题是static_cast
到size_t
的很多int
。