'size_t'vs'container :: size_type'


108

是否有之间的差异size_tcontainer::size_type

我了解的size_t是更通用的,可以用于任何size_types。

但是container::size_type针对特定种类的容器进行了优化吗?

Answers:


108

标准容器限定size_type为一个typedef到Allocator::size_type(分配器是模板参数),其为std::allocator<T>::size_type典型地定义为size_t(或兼容的类型)。因此,对于标准情况,它们是相同的。

但是,如果使用自定义分配器,则可以使用其他基础类型。因此container::size_type,为了获得最大的通用性,它是优选的。


2
你能澄清这个答案吗?我早就回头看过标准草案了,N1804而且我Allocator::size_type和之间没有任何关系size_type。快速浏览libstdc ++不会显示任何类似的内容。
沙菲克·雅格慕

1
@ShafikYaghmour,所以这个答案有点过时了,但是为了最大程度地提高可移植性,我认为建议仍然是正确的:C ++ 03指定了“表32:size_type:可以表示分配模型中最大对象大小的类型”。当时,size_t赌注是这些约束的实际实施。但是,在C ++ 11中,现在std::make_unsigned<X::difference_type>::type默认将其定义为:默认情况下。实际上,这可能与相同或兼容size_t
埃文·特兰

2
CARE答案是不正确....看到stackoverflow.com/questions/4849678/... TL:DR:分配器SIZE_TYPE需要是为size_t在C ++ 17 SIZE_TYPE将被弃用原样。
user3063349 '16

1
@ user3063349我在该页面或C ++ 2017 Standard(23.10.8)中都看不到任何暗示size_type过时的内容。是什么赋予了?
Marc.2377

42
  • size_t定义为用于对象大小的类型,并且取决于平台
  • container::size_type是用于容器中元素数量的类型,并且与容器相关

所有std容器都size_t用作size_type,但是每个独立的库供应商都会选择一种适合其容器的类型。

如果你看 ,您会发现size_typeQt容器的版本与版本有关。在Qt3中是unsigned int,在Qt4中已更改为int


1
我发现将某个东西的大小表示为int有点奇怪。我们可以为容器设置一个负尺寸吗?
Mihai Todor 2012年

10
@MihaiTodor:人们对所有类型都使用带符号的类型并不稀奇,我想Qt会紧随其后。原因是混合运算(尤其是比较运算)是一个灾难区域,以至于许多人宁愿避免对数字使用无符号类型,而不必处理和/或避免混合运算。仅仅因为无符号类型不能表达负数,并不意味着你必须使用他们的数字,不能为负:-)我承认我很惊讶,这是int不是ssize_tint是那种小。
史蒂夫·杰索普

2
“所有标准容器都将size_t用作size_type”非常虚假和误导。是的,他们通常这样做(至少我的所有编译器都这样做),但是C ++语言参考没有说明,所有stl容器都必须类似!如此小心
user3063349 '16


8

对于std::[w]stringstd::[w]string::size_type等于std::allocator<T>::size_type,等于std::size_t。对于其他容器,它是一些实现定义的无符号整数类型。

有时,拥有确切的类型很有用,例如,一个人知道该类型环绕到(例如to UINT_MAX)的位置,以便人们可以使用该类型。或者对于模板,您确实需要将两个相同的类型传递给函数/类模板。

我经常发现我size_t还是为了简洁或迭代器而使用。在通用代码中,由于您通常不知道模板使用哪个容器实例以及这些容器的大小,因此Container::size_type如果需要存储容器大小,则必须使用typedef。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.