在this question我看到以下内容:
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix) {
ivec[ix] = 0;
}
我理解为什么int
这里没有使用,但为什么不使用size_t
?
在什么情况下我应该使用vector<int>::size_type
代替size_t
?
答案 0 :(得分:17)
使用size_type
的主要时间是在模板中。虽然std::vector<T>::size_type
通常为size_t
,但some_other_container<T>::size_type
可能是其他类型,而不是 1 。允许用户添加到std
命名空间的少数几件事之一是针对某些用户定义类型的现有模板的特化。因此,对于某些古怪的std::vector<T>::size_type
,T
可能实际上是size_t
以外的某种类型,即使标准库中定义的基本模板可能始终使用{{ 1}}。
因此,如果要在适用于该容器的模板中为特定容器使用正确的类型,则需要使用size_t
而不是仅假设container::size_type
。
但请注意,通用代码很少直接与容器一起使用。相反,它通常应该使用迭代器,因此它代替size_t
而不是container<T>::size_type
,而不是std::iterator_traits<WhateverIterator>::difference_type
。
T
,vector<T>::size_type
也可能是不同的类型 - 您允许放入std
命名空间的少数几项内容之一是用户定义类型的现有类,因此对于某些T
,vector<T>
可以使用与大多数其他类型完全不同的容器。这是vector<bool>
的典型情况,但也适用于其他类型。答案 1 :(得分:5)
使用它的一个原因是一致性。虽然size_t
确实足以索引/计数std::vector
,但在概念上不足以索引/计数std::list
或任何其他非基于数组的容器。因此,在使用容器时,通常应使用container_type::size_type
。
在通用代码中,当未知容器的实际类型时,您别无选择,只能使用container_type::size_type
。即使在特定代码中,当知道容器为std::vector
时,也不需要发出异常并突然切换到size_t
。
答案 2 :(得分:1)
来自:vector<int>::size_type in C++
“size_type
是vector<int>
类型的(静态)成员类型。通常,typedef
为std::size_t
,unsigned int
本身通常是{的{type} {1}}或unsigned long long
。“
答案 3 :(得分:-1)
我认为他们是一样的。
typedef typename Allocator::size_type size_type;