8

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

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

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

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

4

4 回答 4

18

主要使用时间size_type是在模板中。虽然std::vector<T>::size_type通常是size_t,但some_other_container<T>::size_type可能是一些其他类型而不是1。允许用户添加到std命名空间的少数东西之一是对某些用户定义类型的现有模板的特化。因此,即使标准库中定义的基本模板std::vector<T>::size_type可能T 总是使用.size_tsize_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>,但对于其他类型也是可能的。
于 2013-06-23T06:03:09.927 回答
6

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

在泛型代码中,当不知道容器的实际类型时,您别无选择,只能使用container_type::size_type. 甚至在特定代码中,当容器已知std::vectorsize_t.

于 2013-06-23T06:02:49.690 回答
2

来自:C++ 中的 vector<int>::size_type

"size_type是 type 的(静态)成员类型vector<int>。通常,它是typedeffor std::size_t,它本身通常是unsigned intor的 typedef unsigned long long

于 2013-06-23T06:01:09.897 回答
-2

我认为他们是一样的。

typedef typename Allocator::size_type size_type;
于 2013-06-23T10:28:56.990 回答