首页 > Coding > C++11/14 新特性(for循环)

C++11/14 新特性(for循环)

2016年12月5日 发表评论 阅读评论

在C++ 中,遍历一个容器的方法一般是这样的:

对STL比较熟悉的程序员肯定还知道在 <algorithm> 中有一个 for_each 算法,可以用来完成上述功能:

这里借助了 auto 关键字和 lambda 表达式简化了操作。 std::for_each 比起前面 for 循环,最大的好处是不再需要关注迭代器的概念,而只需要关心容器中的元素类型即可。 但这两种方法,都必须显式的给出容器有开头和结尾(begin,end).这是因为上面的两种方法都不是基于范围(range)来设计的. 范围的概念在很多高级语言中都有涉及。例如下面这段 python 代码:

在这种循环中,不再需要关心容器的两端,循环会自动以容器的范围进行展开。而且这种语法可以清楚地表明它的意义。使用这种方式进行循环无疑会使编码和维护更加简便。 现在,c++11 可有了基于范围的 for 循环

在这段代码中,n 是容器 vec 中的一个元素,而 auto 则使用编译器自动推导出 n 的类型。n 之后使用冒号与需要遍历的容器连接,for 将自动在容器的范围内进行迭代。 也可以不使用 auto 关键字,而使用明确的类型来定义局部变量 n ,这里还支持对 n 进行隐式类型转换。 在上面的例子中,我们都是进行只读方式的遍历。如果需要在遍历的同时修改元素,则需要使用引用 :

当然,如果 n 是复杂类型,而我们又不需要对容器元素进行个性,还可以使用 const auto& n 来定义,这样可以提高效率。 需要注意的是,这种用法不是对所有的容器都有效。例如,对于 std::set ,其元素是只读的,不可以使用引用操作符对其进行修改。 而对于 std::map,返回的是 pair ,而不是 iterator:

 

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.