使用size_t作为“for循环”

时间:2016-02-03 22:13:17

标签: c++

我在我的s6上使用C ++应用程序命名为CppDroid来制作快速程序。

如何在其计数器上使用size_t作为“for循环”的限制器?

int c;

//... more codes here...

    for (c=0; c < a.used; ++c)

        //... more codes here...

a.used 是一个来自解决方案的已使用数组,用于生成dynamic sized array

错误是:比较不同符号的整数:'int'和'size_t'(又名unsigned int)

for循环是程序的内部嵌套循环之一,所以我想尽可能地将变量c维护为“int”。

我见过关于Comparing int with size_t的例子,但我不确定它是如何帮助的,因为它是针对“if”条件的。

3 个答案:

答案 0 :(得分:9)

只需使用std::size_t c代替int c

答案 1 :(得分:3)

只要a.used在迭代过程中没有变化,一个常见的习语是:

for(int c=0, n=a.used; c<n; ++c) {
    ...
}

通过这种方式,演员会隐式发生,并且你也有&#34;元素的总数&#34;变量n在循环体中很方便。此外,当n来自方法调用(例如,vec.size())时,您只评估一次,效率稍高。 1

1。理论上,编译器本身可以进行这种优化,但是使用&#34;复杂的&#34;像std::vector之类的东西和一个非常重要的循环体,它很难证明它是一个循环不变的,所以它经常在每次迭代时重新计算。 功能

答案 2 :(得分:2)

关于

  

不同符号整数的比较:'int'和'size_t'(又名unsigned int)

...这是警告。除非您要求编译器将警告视为错误,否则阻止创建可执行文件不是错误

解决这个问题的一个非常直接的方法是使用强制转换int(a.size)

更一般地,我建议定义一个共同的功能,例如名为n_items(C ++ 17将具有size函数,遗憾的是,它具有无符号结果并且将两个或更多逻辑函数混合在一起,因此名称被取用):

using My_array = ...; // Whatever

using Size = ptrdiff_t;

auto n_items( My_array const& a )
    -> Size
{ return a.used; }

然后是你的循环:

for( int c = 0; c < n_items( a ); ++c )

顺便说一句,重用变量通常不是一个好主意,就像这里的c一样。我假设重用是无意的。上面的示例显示了如何在for循环头中声明循环变量。

此外,正如Matteo Italia中的his answer注意事项,如果测量表明它是一个瓶颈,那么手动优化这样的循环有时是个好主意。这是因为编译器无法轻易证明n_items调用的结果或任何其他动态数组大小表达式在循环体的所有执行中都是相同的(“不变”)。

因此,如果测量告诉您可能重复的大小表达式评估是瓶颈,您可以这样做。

for( int c = 0, n = n_items( a ); c < n; ++c )

值得注意的是,任何手动优化都会带来成本,而这些成本并不容易衡量,但这些成本非常严重,通常的建议是推迟优化,直到测量结果告诉您确实需要它为止。