基于范围的for循环(auto+for)

1,520 阅读1分钟

某一天看到班里面大佬在用vector时,在for循环处使用了for(auto i:tmp) 这样的语句。

就觉得很是神奇,为什么for循环可以被简化成这样?!

后来就上网查阅资料,发现这个就是叫做基于范围的for循环

基本格式

(现在我有一个容器,设为tmp)

那么对其遍历可以使用以下两种形式

  1. for(auto i:tmp)

  2. for(auto &i:tmp)

大概你也看到引用了 所以说这两种的主要区别就是上面的只读的,下面的是可以修改值的

这个其实就是C++11提供给我们的一种简写的方式

注意事项

这里可以参考基于范围的For使用需要注意的细节

我简单提出几点自己可能会用到的

  1. 不要改变容器(这个必出锅)

  2. 如果冒号后面的表达式是一个函数调用时,函数仅会被调用一次。

  3. 要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。因为选用引用类型作为循环控制变量,除了要改变数组元素的值,更为了避免数组被自动转成指针。

举个例子

用自己python大作页业中的一段代码来演示一下吧🤞

virtual antlrcpp::Any visitOr_test(Python3Parser::Or_testContext *ctx) override {
        const auto tmp= ctx->and_test();
        if((signed)tmp.size()==1)
            return visitAnd_test(tmp[0]);
        for(auto i:tmp){
            Rec T=visitAnd_test(i).as<Rec>();
            if(T.transbool().getbool()) return Rec(bool(true));
        }
        return Rec(bool(false));
    }