C ++重复N次迭代

时间:2019-02-28 11:40:51

标签: c++ c++11

我可以清楚地执行以下操作:

for(int i = 0; i < 10000; i++)
    testIteration();

但是是否有任何std函数在一行中做类似的事情?像这样:

std::repeat(10000, testIteration);

5 个答案:

答案 0 :(得分:7)

proposed standard for C++20中有一个iota_view的示例:

for (int i : iota_view{1, 10})
  cout << i << ' '; // prints: 1 2 3 4 5 6 7 8 9

但是目前,可以使用range-v3库:

for (int _ : view::iota{0, 10})
    testIteration();            // calls testIteration 10 times.

答案 1 :(得分:4)

  

但是是否有任何std函数在一行中做类似的事情?

否,标准库中没有算法可以做到这一点(至少不需要编写无用的样板文件)。正如其他人已经提到的,循环是执行n次“某事”的最易读且最不混淆的方式。

话虽如此,如果您将它作为练习来获得更简洁的语法,则可以这样编写:

#include <iostream>
struct my_counter {    
    int stop;
    struct iterator {
        int count;    
        iterator& operator++() { ++count; return *this; }
        int operator*() { return count;}
        bool operator!=(const iterator& other) { return count != other.count; }
    };
    iterator begin() { return {0}; }
    iterator end() { return {stop};}    
};

void print() { std::cout << "x"; }

int main() {
     for (auto x : my_counter{5}) print();
}

但是,我强烈建议您不要使用类似的东西。每个人都知道循环的工作原理和作用。习惯于for循环,您可以眨眼间阅读for循环,而其他任何事情都不常见,令人惊讶且令人困惑(除非当然有标准算法,尽管我怀疑这种特殊情况下的算法是否会有用,为什么可以在使用循环时重新发明轮子?)

答案 2 :(得分:0)

我个人喜欢使用一个小的辅助函数来完成此操作。

template <typename F>
void repeat(size_t n, F f) {
  while (n--) f();
}

int main() {

   repeat(1000, [&] {
      testIteration();
   });
}

这避免了必须拼出变量名称的麻烦。我更喜欢在需要名称时使用view :: iota。

话虽这么说,但我被告知这让人难以理解,而且每个人都可以读取for循环,所以这可能是解决之道。 (当然,除非函数放在std ::中)。

答案 3 :(得分:0)

简单定义宏呢? #define FOR(N, foo, ...) for (int _i = 0; _i < N; _i++) foo(__VA_ARGS__);

例如

#include <iostream>

#define FOR(N, foo, ...) for (int _i = 0; _i < N; _i++) foo(__VA_ARGS__);

void bar(int a, int b)
{
    std::cout << "hello " << a+b << std::endl;
}

int main()
{
    FOR(5, bar, 12, 6);
    return 0;
}

输出:

hello 18
hello 18
hello 18
hello 18
hello 18

答案 4 :(得分:0)

仅供参考,可以使用std::generatestd::generate_n,但只能通过执行以下操作来初始化数组:

int i = 0;
std::generate_n(myArray, 10000, [&]() -> int { return i++; });