size_t
和container::size_type
之间是否存在差异?
据我所知,size_t
更通用,可用于任何size_type
。
但container::size_type
是否针对特定种类的容器进行了优化?
答案 0 :(得分:96)
标准容器将size_type
定义为Allocator::size_type
的类型定义(分配器是模板参数),std::allocator<T>::size_type
通常定义为{{ 1}}(或兼容的类型)。所以对于标准情况,它们是相同的。
但是,如果使用自定义分配器,则可以使用不同的基础类型。因此,size_t
最适用于通用性。
答案 1 :(得分:36)
size_t
被定义为用于对象大小的类型,并且依赖于平台。container::size_type
是用于容器中元素数量的类型,取决于容器。所有std
个容器都使用size_t
作为size_type
,但每个独立的库供应商都会选择一个适合其容器的类型。
如果查看qt,您会发现Qt容器的size_type
与版本有关。在Qt3中,它是unsigned int
,在Qt4中,它已更改为int
。
答案 2 :(得分: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。