我什么时候应该使用vector <int> :: size_type而不是size_t?</int>

时间:2013-06-23 05:52:15

标签: c++ vector stl int size-t

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

4 个答案:

答案 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


  1. 对于某些特定的Tvector<T>::size_type也可能是不同的类型 - 您允许放入std命名空间的少数几项内容之一是用户定义类型的现有类,因此对于某些Tvector<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_typevector<int>类型的(静态)成员类型。通常,typedefstd::size_tunsigned int本身通常是{的{type} {1}}或unsigned long long。“

答案 3 :(得分:-1)

我认为他们是一样的。

typedef typename Allocator::size_type size_type;