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

Deq*_*ing 8 c++ int stl vector size-t

这个问题中我看到以下内容:

for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix) {
    ivec[ix] = 0;
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么int不在这里使用,但为什么不使用size_t

在什么情况下我应该用vector<int>::size_type而不是size_t

Jer*_*fin 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,即使标准库中定义的基本模板可能总是使用size_t.

因此,如果要对与该容器一起使用的模板内的特定容器使用正确的类型,则需要使用container::size_type而不是仅仅假设size_t.

但请注意,通用代码很少直接与容器一起使用.相反,它通常应该与迭代器一起使用,因此container<T>::size_type它通常会使用类似的东西std::iterator_traits<WhateverIterator>::difference_type.


  1. 而对于某些特定的T,vector<T>::size_type也可能是一个不同的类型 - 允许放入std命名空间的少数几件事之一是用户定义类型的现有类的特化,因此对于某些类型T,vector<T>可以完全使用与大多数其他类型不同的容器.这是典型的vector<bool>,但也可用于其他类型.


AnT*_*AnT 5

使用它的一个原因是一致性.虽然确实size_t足以索引/计数a std::vector,但它在概念上不足以索引/计数一个std::list或任何其他非基于数组的容器.因此,在使用容器时,通常应该使用container_type::size_type.

在通用代码中,当容器的实际类型未知时,您别无选择,只能使用container_type::size_type.即使在特定代码中,当容器已知为a时std::vector,也不需要异常并突然切换到size_t.

  • @Nawaz:`size_t`可以容纳最大可能连续对象的大小.这就是为什么数组总是足够的原因.但是,不能保证`size_t`足够大以容纳整个可用内存的大小.如果没有要求连接器是连续的,那么它可能包含比`size_t`更多的小元素.一个典型的例子是旧的分段内存平台,如DOS或Win16.标准内存模型中的`size_t`只有16位宽,而可用内存空间远大于64K. (5认同)
  • 在具有这种内存模型的分段平台上,您不能拥有大于 64K 的数组,但您可以轻松拥有超过 64K 元素的列表。足以计算任何东西的整数类型实际上是 `uintptr_t`,而不是 `size_t`。 (2认同)