在这个问题中,我看到以下内容:
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix) {
ivec[ix] = 0;
}
我明白为什么int
不在这里使用,但为什么不直接使用size_t
?
在什么情况下我应该使用vector<int>::size_type
而不是size_t
?
主要使用时间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
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>
,但对于其他类型也是可能的。使用它的一个原因是一致性。虽然确实size_t
足以索引/计数 a std::vector
,但在概念上不足以索引/计数 astd::list
或任何其他基于非数组的容器。因此,在使用容器时,您通常应该使用container_type::size_type
.
在泛型代码中,当不知道容器的实际类型时,您别无选择,只能使用container_type::size_type
. 甚至在特定代码中,当容器已知std::vector
为size_t
.
来自:C++ 中的 vector<int>::size_type
"size_type
是 type 的(静态)成员类型vector<int>
。通常,它是typedef
for std::size_t
,它本身通常是unsigned int
or的 typedef unsigned long long
。
我认为他们是一样的。
typedef typename Allocator::size_type size_type;