【发布时间】:2010-10-29 10:45:00
【问题描述】:
size_t 和 container::size_type 有区别吗?
我的理解是size_t 更通用,可以用于任何size_types。
但是container::size_type 是否针对特定类型的容器进行了优化?
【问题讨论】:
标签: c++ size-type container-data-type
size_t 和 container::size_type 有区别吗?
我的理解是size_t 更通用,可以用于任何size_types。
但是container::size_type 是否针对特定类型的容器进行了优化?
【问题讨论】:
标签: c++ size-type container-data-type
标准容器将size_type 定义为Allocator::size_type 的typedef(分配器是模板参数),对于std::allocator<T>::size_type,通常定义为size_t(或兼容类型)。所以对于标准情况,它们是相同的。
但是,如果您使用自定义分配器,则可以使用不同的底层类型。因此,container::size_type 更适合最大程度的通用性。
【讨论】:
N1804 的标准草案,我看不出Allocator::size_type 和size_type 之间有任何关系。快速浏览一下 libstdc++ 也没有发现任何类似的东西。
size_t 是这些约束的最佳实际实现。但是,在 C++11 中,它现在基本上定义为:std::make_unsigned<X::difference_type>::type 默认情况下。在实践中,可能与size_t 相同或兼容。
size_type 弃用的内容。什么给了?
size_t 被定义为用于对象大小的类型,并且平台相关。container::size_type 是用于容器中元素数量的类型,并且依赖于容器。所有std 容器都使用size_t 作为size_type,但每个独立的库供应商都会选择一种它认为适合其容器的类型。
如果您查看qt,您会发现Qt 容器的size_type 是依赖于版本的。在 Qt3 中为 unsigned int,在 Qt4 中更改为 int。
【讨论】:
int 而不是ssize_t, int 有点小。
对于std::[w]string,std::[w]string::size_type 等于std::allocator<T>::size_type,等于std::size_t。对于其他容器,它是一些实现定义的无符号整数类型。
有时拥有确切的类型很有用,例如,知道类型环绕到哪里(例如,到UINT_MAX),以便可以利用它。或者对于模板,您确实需要将两个相同的类型传递给函数/类模板。
为了简洁起见,我经常使用size_t 或使用迭代器。在通用代码中,由于您通常不知道您的模板与哪个容器实例一起使用以及这些容器的大小,因此如果您需要存储容器大小,则必须使用Container::size_type typedef。
【讨论】: