我可以清楚地执行以下操作:
for(int i = 0; i < 10000; i++)
testIteration();
但是是否有任何std函数在一行中做类似的事情?像这样:
std::repeat(10000, testIteration);
答案 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::generate
和std::generate_n
,但只能通过执行以下操作来初始化数组:
int i = 0;
std::generate_n(myArray, 10000, [&]() -> int { return i++; });