我可以清楚地做到这样:
for(int i = 0; i < 10000; i++)
testIteration();
但是是否有类似的一行代码的标准函数?像这样:
std::repeat(10000, testIteration);
但是是否有标准函数可以在一行中执行类似的操作呢?
不,标准库中没有算法可以做到这一点(至少没有不需要编写无用样板代码的算法)。正如其他人已经提到的,循环是最可读且最不混淆的方式来执行 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循环,而其他任何东西都是不寻常的、令人惊讶的和难以理解的,除非有一个标准算法(尽管我怀疑这种特殊情况的算法会有很大用处)。当你可以使用循环时,为什么要重新发明轮子呢?
template <typename F>
void repeat(size_t n, F f) {
while (n--) f();
}
int main() {
repeat(1000, [&] {
testIteration();
});
}
这样可以避免拼写变量名称的麻烦。但是当我需要变量名称时,我更喜欢使用view::iota。
话虽如此,有人告诉我这样写不易理解,每个人都能读懂for循环,所以这可能是更好的选择。(当然,如果该函数被放在std命名空间中,则除外)。
除了我的解决方案非常简短之外,我知道这并没有提供与上面答案不同的内容。要重复代码2次,我使用如下循环:
for (auto _{2}; _--;) { /* this code gets repeated twice */ }
我认为使用前缀运算符会不够清晰,因为要重复两次代码,循环需要是:
for (auto _{3}; --_;) { /* this code gets repeated twice */ }
当然,小括号也可以代替大括号,例如:
for (auto _(2); _--) {}
std :: generate
和std :: generate_n
可用,但仅适用于通过执行以下操作进行数组初始化:int i = 0;
std::generate_n(myArray, 10000, [&]() -> int { return i++; });
那么简单地定义一个宏怎么样呢?
#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
std::for_each
完成一些操作。在C++20变得广泛可用之前,你可以使用ranges库,这是C++20 ranges的基础库。 - Some programmer dudestd
中(因为这样做会导致未定义的行为)。 - Peterstd::for_each_n
,但它在gcc和clang中没有实现;3/C++20范围可能是一个解决方案;4/提醒一下1/。 - YSC