'size_t'与'container::size_type'的区别

134

size_tcontainer::size_type之间有区别吗?

我的理解是,size_t更通用,可以用于任何size_type

但是,container::size_type是否针对特定类型的容器进行了优化?

3个回答

125

标准容器将size_type定义为对Allocator::size_type (Allocator是一个模板参数)的typedef,对于std::allocator<T>::size_type来说,通常定义为size_t (或兼容类型)。因此,在标准情况下,它们是相同的。

然而,如果您使用自定义分配器,可能会使用不同的底层类型。因此,container::size_type更适用于最大的一般性。


4
你能澄清这个答案吗?我已经查看了追溯到N1804的草案标准,但我没有看到Allocator::size_typesize_type之间的任何关系。快速浏览libstdc++也没有发现类似的情况。 - Shafik Yaghmour
1
@ShafikYaghmour,所以这个答案有点过时了,但为了最大化可移植性,我认为建议仍然是正确的:C++03指定“Table 32: size_type:可以表示分配模型中最大对象的类型。”当时,size_t是实现这些约束的最佳实践。然而,在C++11中,它现在基本上被定义为:std::make_unsigned<X::difference_type>::type默认情况下。在实践中,这可能与size_t相同或兼容。 - Evan Teran
4
CARE 答案不正确。请访问 https://dev59.com/KG445IYBdhLWcg3wdqEL简要概述: 分配器的 size_type 需要是 size_t,在 C++17 中,size_type 将被弃用。 - user3063349
1
@user3063349 我在那个页面上以及C++ 2017标准(23.10.8)中没有看到任何关于size_type被弃用的提示。这是怎么回事? - Marc.2377
@Marc.2377 请查看 https://omegaup.com/docs/cpp/zh-cn/cpp/memory/allocator.html - Shawn

50
  • size_t 定义了用于对象大小的类型,是与平台相关的。
  • container::size_type是用于表示容器元素数量的类型,并且是与容器相关的。

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

如果你查看,你会发现Qt容器的size_type与版本相关。在Qt3中,它是unsigned int,而在Qt4中则改为了int


1
我觉得用int来表示某个东西的大小有点奇怪。我们会有容器的负大小吗? - Mihai Todor
13
人们普遍使用带符号的类型进行所有操作并不罕见,我猜Qt也是这样做的。原因是混合运算(尤其是比较操作)是一个灾难区域,许多人宁愿避免使用无符号类型来表示数字,而不是处理和/或避免混合操作。仅仅因为无符号类型无法表示负数,并不意味着您必须将其用于不能为负的数字 :-) 我承认我很惊讶它使用的是 int 而不是 ssize_tint 有点小。 - Steve Jessop
4
“所有标准容器使用 size_t 作为 size_type”这句话非常不准确且具有误导性。虽然它们通常这样做(至少我使用的所有编译器都是这样实现的),但是 C++ 语言参考并未规定所有 STL 容器必须采用相似的实现方式!因此请注意。 - user3063349
3
值得注意的是,大小无法用 std::size_t 表示的类型是不合规的 - Ayxan Haqverdili

9
对于std::[w]stringstd::[w]string::size_type等于std::allocator<T>::size_type,也等于std::size_t。对于其他容器而言,其大小是一些实现定义的无符号整型。
有时候确切的类型很有用,例如人们需要知道类型何时会回绕(比如到达UINT_MAX),以便可以利用它。或者对于模板,人们真的需要将两个相同的类型传递给函数/类模板。
通常我发现我为了简洁起见或者迭代器而使用size_t。在通用代码中,由于你通常不知道你的模板将与哪个容器实例一起使用以及这些容器的大小,因此如果需要存储容器的大小,则必须使用Container::size_type typedef。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接