【问题标题】:Is it okay to use int instead of a size_t in looping over a vector?在循环向量时可以使用 int 而不是 size_t 吗?
【发布时间】:2013-03-29 14:11:12
【问题描述】:

如果我有一个整数向量

vector<int> vec;

我按以下方式循环

for(int i=0; i<vec.size(); i++)
{
   // do something
}

我收到有符号/无符号不匹配警告。

当然我可以声明size_t 类型的i 来解决问题。 但是,如果我将i 保留为int,我会在运行时遇到问题吗?

【问题讨论】:

  • 您对i 使用错误类型的动机是什么?你没有提到为什么你想使用int
  • 如果vec.size() 大于signed int 的正数范围怎么办?
  • 我认为更一般地说,你会想使用std::vector&lt;int&gt;::size_type(我想它几乎总是size_t,但仍然如此)。
  • 你也可以通过for(int val:vec)完全避免这个问题
  • @MatsPetersson:加上一些额外的复杂性,for (X val:vec) { ... } 基本上被定义为等同于for(auto it = begin(vec), itend = end(vec); it != itend; ++it) { X val = *it; ... }(其中ititend 不是那些确切的符号,它们可以实现-保留符号或被编译器完全隐藏)。所以 Drew 代码中的int 是元素(副本)的类型,而不是索引的类型。

标签: c++ warnings unsigned signed


【解决方案1】:

改用向量iterator

vector<int>::iterator it;
for (it = vec.begin(); it!= vec.end(); ++it)
{
   //do something
}

【讨论】:

  • +1。这个问题的 OP/读者绝对应该知道这一点。
【解决方案2】:

当然,如果 vec.size() 大于有符号整数的最大值。

您可以在 limits.hthis table 中找到最大值。

【讨论】:

  • 所有答案都很好。所以我会选择最老的。谢谢大家。
【解决方案3】:

是的。对于超过 signed 可以存储的值的大数字,这将是未定义的行为。

但是对于可以存储在signed 中的少量数字,没关系。

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多