【问题标题】:Declaring in for-loop for vector operations [duplicate]在for循环中声明向量操作[重复]
【发布时间】:2013-03-13 11:06:56
【问题描述】:

考虑这段代码:

vector<double> student_grades(20);

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

以这种方式声明 i 而不是仅仅声明 int i = 0 到底有什么不同?

【问题讨论】:

  • 想想如果你有超过 20 亿学生需要处理会发生什么。
  • 其他人给出的链接显示它可以是无符号整数,也可以是长整数。差异不是由于向量的大小。

标签: c++ for-loop vector


【解决方案1】:

以这种方式声明 i 而不是仅仅声明 int i = 0 到底有什么不同?

它确保使用正确的类型 - 您假设 vector&lt;T&gt;::size_type 始终与 int 相同,但这种假设是不正确的。根据实现的不同,它也可能是 unsigned intlongunsigned longsize_t

通过使用vector&lt;T&gt;::size_type,您的代码在不同的实现中保持可移植性。

另见vector<int>::size_type in C++

【讨论】:

  • 现在说得通了。谢谢先生。
【解决方案2】:

size_type 是向量类中的 typedef,它使vector 类有机会决定使用哪种类型进行索引。 int 的最大值为 2^31(通常,但不保证 - 我认为保证至少为 32767)。由于有时我们需要大于 20 亿个项目的向量 [诚然不是经常,我怀疑],因此由类本身指定类型很有用。

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

它也几乎总是一个无符号类型。在某些情况下,这会使数组的索引更有效,这也有助于提高性能。

【讨论】:

  • 谢谢,很好的解释。
【解决方案3】:

vector&lt;T&gt;::size_typestd::vectorstatic 成员。我不知道为什么有人会使用它,因为它可能会导致混乱,我猜。看here这个他已经在SO上回答了。

【讨论】:

  • 您建议使用它?这不是与您的链接问题的答案相反吗?
  • 我认为这令人困惑,无法理解。但为了进一步参考,我提供了链接。
【解决方案4】:

size_type 是类型向量的(静态)成员类型。通常, 它是 std::size_t 的 typedef,它本身通常是 unsigned int 或 unsigned long long。

Link to this question

标准容器将 size_type 定义为 typedef Allocator::size_type(Allocator 是一个模板参数),它用于 std::allocator 被定义为 size_t。

Link to this question

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2021-08-29
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多