for-loop的简写 - C++中的句法糖(11)

din*_*dum 18 c++ syntax for-loop syntactic-sugar c++11

实际上这些是两个相关的问题.

我知道C++ 11中有一种新的语法,用于for表单的基于范围的循环:

//v is some container
for (auto &i: v){
   // Do something with i
}
Run Code Online (Sandbox Code Playgroud)

第一个问题:我怎样才能推断出我在这个循环中的迭代次数?(假设我想在位置j处填充值为j的向量).

第二个问题:我想知道是否还有其他方法来编写表单的循环

for (int i=0; i<100; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

我发现这种编写方式有点麻烦,我经常这样做,我希望有一个更简洁的语法.一些事情:

for(i in [0..99]){ ... }
Run Code Online (Sandbox Code Playgroud)

会很好.

对于这两个问题,我希望避免使用其他库.

Mik*_*our 21

第一个答案:你没有.你为简单的目的使用了一个简单的结构; 如果你有更复杂的需求,你将需要更复杂的东西.

第二个答案:你可以创建一个产生连续整数值的迭代器类型,以及一个给出一系列范围的"容器"类型.除非你有充分的理由亲自去做,Boost有这样的事情:

#include <boost/range/irange.hpp>

for (int i : boost::irange(0,100)) {
    // i goes from 0 to 99 inclusive
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*r K 15

用这个:

size_t pos = 0;
for (auto& i : v) {
    i = pos;
    ++pos;
}
Run Code Online (Sandbox Code Playgroud)

(提升很好,但并不是普遍接受的.)


Rei*_*ica 11

对于第一个问题,答案很简单:如果需要迭代计数,请不要使用抽象迭代计数的语法结构.只需使用普通for循环而不是基于范围的循环.

对于第二个问题,我认为目前标准库中没有任何内容,但您可以使用boost::irange它:

for (int i : boost::irange(0, 100))
Run Code Online (Sandbox Code Playgroud)

  • @ingalapadum如果你不考虑增加一个"额外的lib",你将为自己节省一个痛苦和轮子重塑的世界.只需将其视为"标准库附录". (5认同)
  • @Aracthor:另一方面,Boost非常普遍,以至于很多其他代码都不会与它发生冲突.编写你自己的等价物,你可能会发现意外的重载等.至于速度,所有主要的编译器制造商都使用Boost作为基准测试之一. (3认同)
  • 他们最近分离了最常用的功能来创建Boost.Core和一些更小的模块,以减少整体依赖性.并且Boost.Intrusive和Boost.Containers已经部分重写为Boost 1.58,以便它们编译得更快. (2认同)