代码之家  ›  专栏  ›  技术社区  ›  Björn Pollex

对于可能在结束前中断的迭代,使用什么循环?

  •  0
  • Björn Pollex  · 技术社区  · 14 年前

    我有一系列的内存需要解析。如果在结束之前发现某个字节序列,则中断迭代。我不知道在这里我更喜欢哪个循环:

    while(i < end && !sequenceFound ) {
        // parse
        i++;
    }
    

    或者

    for( i; i < end && !sequenceFound; i++ ) {
        // parse
    }
    

    这用于从实现环形缓冲区的类派生的类的方法中。超类提供 i end . 我的问题是,对于不熟悉代码的人,你认为哪一个更容易理解(更好地表达意图)?

    编辑 break 并设置 sequenceFound = true ,但那是多余的,还是我在这里太严格了?

    9 回复  |  直到 14 年前
        1
  •  6
  •   CB Bailey    14 年前

    break;

    如果您需要知道迭代是否提前终止,您可以使用条件 i != end. 中断;

        2
  •  4
  •   fredoverflow    14 年前

    更喜欢算法而不是手写循环。

    #include <algorithm>
    
    auto it = std::find(begin, end, predicate);
    if (it == end)
        :-(
    else
        :-)
    
        3
  •  3
  •   Puppy    14 年前

    对于有显式限制的迭代,我通常使用For循环。当迭代没有上限时,应该使用While循环。

        4
  •  3
  •   Konrad Rudolph    14 年前

    对于具有循环变量和结束的循环(即,通过检查 i != end i < end )我赞成 for 因为这或多或少是 .

    如果你过早地退出循环, break :

    for(; i != end; ++i) {
        // parse
        if (sequenceFound)
            break;
    }
    
        5
  •  1
  •   willcodejavaforfood    14 年前

    我赞成 while until 在某些语言中也可以使用。

        6
  •  0
  •   Alex F    14 年前

        7
  •  0
  •   slosd    14 年前

    如果在每次迭代之前要检查多个条件,我通常使用while循环。

        8
  •  0
  •   Michael    14 年前

    同意Charles Bailey的观点,因为一旦你在迭代中中断,你就可以立即中断最直接的循环结构,而不必重新计算条件变量。另外,您不需要额外的条件变量,因此减少了运行代码块所需的内存。

        9
  •  0
  •   sje397    14 年前

    我更喜欢 for break 内部。

    原因是,你可以避免丑陋的结构,必须检查你的'打破'的条件,例如:

    for(; i != end; ++i) {
    
        // do stuff
    
        if (sequenceFound) break;
    
        // you don't need an 'if(!sequenceFound)' around this block of code
        // do more stuff
    }