• 关于使用for循环


    有人喜欢使用for作类似while的循环:

    for(;;) { }

    评论:这是一种风格,有一部分人使用,我个人觉得不如while来得直观。

    究竟是++i,还是i++

    for (int i = 0; i < arrayA.Length; ++i) { }

    for (int i = 0; i < arrayA.Length; i++{ }

    以前我使用i++的写法,后来,看到一些优秀的代码中,大多使用++i,我就改用++i了。为什么使用++i,看到过一些理由,但觉得那些理由,不值一提。

    使用i, j, k作多层循环

    for (int i = 0; i < arrayA.Length; ++i) 
    {
      Object[] arrayB 
    = arrayA[i];
        
    for (int j = 0; j < arrayB.Length; ++j)
        
    {
            Object b 
    = arrayB[j]; //此处需要多加注意,一不留神就会写成Object b = arrayB[i];
        }
     
    }

    使用i, j, k做多层循环时,很容易犯错误,如上述代码中的注释缩写的那样。我参加的代码评审(Code Review)中,或者开发过程中,经常有同事遇到这种BUG。我也曾经吃过亏,每次编写i, j, k多层for循环时,就会提醒自己,小心,别犯错误!

    使用for的习惯,除了++i和i++的写法不同外,还有和if、while等语句一样的不同写法,如下:

    第一种写法
    a、关键字for后面有空格
    b、二元表达式左右有空格
    c、每个大括号,单独占一行
    d、else关键字单独占一行

    for (int i = 0; i < list.Count; ++i)
    {
    }


    第二种写法:
    a、关键字if后面有空格
    b、二元表达式左右有空格
    c、大括号放在上一句的右边

    for (int i = 0; i < list.Count; ++i) {
    }


    需要优化是,可能你也会采用这种写法:

    int listCount = list.Count;
    for (int i = 0; i < listCount; ++i) { }

    如果for循环中,不会添加或者删除list的元素,使用这种方式优化,可能得到一丁点(可能不值一提)的性能提升。

    需要从list中删除元素时,可能你会使用反序的遍历。如下:

    int listCount = list.Count;
    for (int i = listCount - 1; i >= 0--i) 
    {
        
    if (condition) 
        
    {
            list.RemoveAt(i);
        }

    }

    如果list的实现是ArrayList,反序遍历可能比正序删除的性能更高一些。

    此外,for还有一些其他的使用方式,如:

    for (init(); condition(); incement()) { }
    for (; i < j; ++i, --j) { };
  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/jobs/p/26691.html
Copyright © 2020-2023  润新知