【问题标题】:'size_t' vs 'container::size_type''size_t' 与 'container::size_type'
【发布时间】:2010-10-29 10:45:00
【问题描述】:

size_tcontainer::size_type 有区别吗?

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

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

【问题讨论】:

    标签: c++ size-type container-data-type


    【解决方案1】:

    标准容器将size_type 定义为Allocator::size_type 的typedef(分配器是模板参数),对于std::allocator<T>::size_type通常定义为size_t(或兼容类型)。所以对于标准情况,它们是相同的。

    但是,如果您使用自定义分配器,则可以使用不同的底层类型。因此,container::size_type 更适合最大程度的通用性。

    【讨论】:

    • 你能澄清这个答案吗?我回顾了早在N1804 的标准草案,我看不出Allocator::size_typesize_type 之间有任何关系。快速浏览一下 libstdc++ 也没有发现任何类似的东西。
    • @ShafikYaghmour,所以这个答案有点过时了,但为了最大限度地提高可移植性,我认为建议仍然是合理的:C++03 指定“表 32:size_type:一种可以表示大小的类型分配模型中的最大对象。”当时,size_t 是这些约束的最佳实际实现。但是,在 C++11 中,它现在基本上定义为:std::make_unsigned<X::difference_type>::type 默认情况下。在实践中,可能与size_t 相同或兼容。
    • CARE 答案不正确......请参阅stackoverflow.com/questions/4849678/… TL:DR:分配器 size_type 需要为 size_t 并且在 C++17 中 size_type 将按原样弃用。
    • @user3063349 我在该页面和 C++ 2017 标准 (23.10.8) 中都看不到任何暗示 size_type 弃用的内容。什么给了?
    【解决方案2】:
    • size_t 被定义为用于对象大小的类型,并且平台相关
    • container::size_type 是用于容器中元素数量的类型,并且依赖于容器

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

    如果您查看,您会发现Qt 容器的size_type 是依赖于版本的。在 Qt3 中为 unsigned int,在 Qt4 中更改为 int

    【讨论】:

    • 我觉得将某个东西的大小表示为 int 有点奇怪。我们可以为容器设置负尺寸吗?
    • @MihaiTodor:人们对所有事物都使用有符号类型并不罕见,我猜 Qt 也在效仿。原因是混合操作(特别是比较)是一个灾难领域,以至于许多人宁愿避免对数字使用无符号类型,也不愿处理和/或避免混合操作。仅仅因为无符号类型不能表示负数,并不意味着您必须将它们用于不能为负数的数字 :-) 我承认我很惊讶它是 int 而不是ssize_t, int 有点小。
    • “所有标准容器都使用 size_t 作为 size_type”非常非常错误和误导。是的,他们通常会这样做(至少我所有的编译器都是这样做的)但是 C++ 语言参考没有说明,所有 stl 容器都需要相似!所以关心
    【解决方案3】:

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

    有时拥有确切的类型很有用,例如,知道类型环绕到哪里(例如,到UINT_MAX),以便可以利用它。或者对于模板,您确实需要将两个相同的类型传递给函数/类模板。

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

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 2011-06-18
      • 2012-10-11
      • 2017-12-23
      • 2012-09-11
      • 2021-04-11
      • 2014-12-13
      • 2012-05-18
      相关资源
      最近更新 更多