在for循环中声明vector操作

Declaring in for-loop for vector operations

本文关键字:vector 操作 声明 for 循环      更新时间:2023-10-16

考虑以下代码:

vector<double> student_grades(20);
for (vector<double>::size_type i = 0; i < student_grades.size(); i++)
{
    cout << i << endl;
}

用这种方式声明i和仅仅声明int i = 0有什么不同?

用这种方式声明i和int i = 0有什么不同?

它确保使用正确的类型-您假设vector<T>::size_type总是与int相同,但这个假设是不正确的。根据具体实现,也可以是unsigned intlongunsigned longsize_t

通过使用vector<T>::size_type,您的代码在不同的实现之间保持可移植性。

参见vector

size_type是vector类内部的一个typedef,这使vector类有机会决定使用什么类型进行索引。int的最大值为2^31(通常,但不保证-我认为它至少保证为32767)。由于有时我们需要比20亿个元素更大的向量(诚然,我怀疑不是经常如此),因此由类本身指定类型是有用的。

此类型保证覆盖vector实现本身可以处理的范围。它不会太大[如果您选择在32位系统上使用long long,它将比您需要的要大],也不会太小。当然,如果你知道你只有10件物品,这可能并不重要。

也几乎总是一个无符号类型。在某些情况下,这使得数组的索引更有效,这也对性能有一点点帮助。

vector<T>::size_typestd::vectorstatic成员。我不知道为什么有人会用它,因为它可能会导致混乱,我猜。看这里,这个问题已经在SO上得到了回答。

size_type是vector类型的(静态)成员类型。通常情况下,它是std::size_t的类型定义,而std::size_t本身通常也是for的类型定义Unsigned int或Unsigned long.

链接到这个问题

标准容器将size_type定义为类型定义Allocator::size_type (Allocator是模板形参),用于Std::allocator被定义为size_t。

链接到这个问题