'size_t'vs'container :: size_type'

Cha*_*unt 100 c++ size-type container-data-type

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

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

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

Eva*_*ran 100

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

但是,如果使用自定义分配器,则可以使用不同的基础类型.所以container::size_type最好是最大限度的通用性.

  • 你能澄清这个答案吗?我回顾了标准草案,可以追溯到'N1804`,我没有看到`Allocator :: size_type`和`size_type`之间有任何关系.快速浏览一下libstdc ++并没有显示出类似的内容. (2认同)
  • 注意答案是不正确的....请参阅http://stackoverflow.com/questions/4849678/c-for-loop-size-type-vs-size-t TL:DR:allocators size_type需要是size_t并且在C中++ 17 size_type将按原样弃用. (2认同)

Tim*_*imW 39

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

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

如果你看一下,你会发现size_typeQt容器的版本依赖于版本.在Qt3中,它unsigned int在Qt4中被改为int.

  • @MihaiTodor:人们使用签名类型来表达一切并不罕见,我猜Qt也是如此.原因在于混合操作(特别是比较)是一个灾难区域,许多人宁愿避免使用无符号类型的数字,而不是处理和/或避免混合操作.仅仅因为无符号类型不能表示负数,并不意味着你*将*用于不能为负的数字:-)我承认我很惊讶它是`int`而不是`ssize_t`,` int`有点小. (10认同)
  • 我认为值得注意的是[大小不能用 std::size_t 表示的类型是格式错误的](https://en.cppreference.com/w/cpp/types/size_t) (3认同)
  • “所有标准容器都将size_t用作size_type”非常虚假和误导。是的,他们通常这样做(至少我的所有编译器都这样做),但是C ++语言参考没有说明,所有stl容器都必须类似!所以在意 (2认同)

Joh*_*itb 8

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

有时拥有确切的类型是有用的,所以例如,人们知道类型包含在哪里(比如,到UINT_MAX),以便人们可以利用它.或者对于模板,您确实需要将两个相同的类型传递给函数/类模板.

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