【问题标题】:Playing around with for arguments玩弄争论
【发布时间】:2013-08-20 17:49:18
【问题描述】:

灵感来自this

假设我们有一个非空的std::vector<T> v; 有什么区别

for (int i = v.size() - 1; i >= 0; i--) {
///Stuff.
}

和:

for (int i = v.size(); i--; ) {
///Stuff.
}

?

我的意思是,为了可读性,我不会这样做,但谁知道什么对生活有用......

Here 只是一个测试,看看它们是等价的)

编辑:重点是使用i 作为索引来向后访问向量(在使用索引比使用迭代器更可取的情况下)

编辑 2:出于好奇:它们最终具有略有不同的汇编代码。请参阅thisthis

【问题讨论】:

  • 1) 基准测试发现没有区别。 2) 比较生成的程序集并验证没有什么实质性的不同。
  • @JonathonReinhart 无需删除-1,因为在进入循环之前会检查条件。
  • 你知道你可以使用 reverse_iterators 来做这件事吗?
  • @NeilKirk 是的,谢谢,我愿意。

标签: c++


【解决方案1】:

这是一种合法的做法,但在 for 循环中使用i-- 作为条件在可读性方面是一个糟糕的想法。

for 循环由 3 个部分组成 - 为什么要让人们过得更艰难?

如果您坚持传统的for 循环,阅读您的代码的人会很高兴:

for (int i = v.size() - 1; i >= 0; i--) {
    ///Stuff.
}

【讨论】:

    【解决方案2】:

    可以想到一个for 循环

    for (<decl-init> ; <condition> ; <post-adjust>) <body>
    

    大致相当于这个 while 循环:

    <decl-init>;
    while (condition) {
        <body>;
        <post-adjust>;
    }
    

    for和上面的rewrite最大的区别在于&lt;decl-init&gt;块中声明的变量的作用域,但这对于下面的分析并不重要。

    将两个循环重写为while 循环可以得到:

    int i = v.size() - 1;
    while ( i >= 0 ) {
        <body>;
        i--;
    }
    

    对比

    int i = v.size(); 
    while (i--) {
        <body>;
    }
    

    如你所见,唯一的区别是i在进入迭代之前递减,条件以i开始,比第一个循环大1。这两个调整“相互抵消”,使您的循环从技术角度来看是等效的。不过,美学是另一回事:具有副作用的条件比“纯”条件更难理解,因此第一个循环更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多