来自Python世界的我发现std::iota函数非常有限。为什么接口被限制为不接受任何UnaryFunction?
例如,我可以转换
>>> x = range(0, 10)转到
std::vector<int> x(10);
std::iota(std::begin(x), std::end(x), 0);但人们会怎么做:
>>> x = range(0,20,2)甚至是
>>> x = range(10,0,-1)我知道编写这样一个函数或使用Boost是微不足道的,但我想C++委员会一定是谨慎地选择了这个设计。所以很明显,我错过了C++11的一些东西。
发布于 2015-12-31 10:17:38
std::generate怎么样?
int n = -2;
std::generate(x.begin(), x.end(), [&n]{ return n+=2; });
int n = 10;
std::generate(x.begin(), x.end(), [&n]{ return n--;});发布于 2020-12-13 16:52:35
使用C++20范围,您可以这样编写它:
static auto stepped_iota(int start, int step) {
return std::ranges::views::iota(0) |
std::ranges::views::transform([=](int x) { return x * step + start; });
}
void f() {
for (int x : stepped_iota(0, 2)) { ... }
}或者,如果你希望范围是有限的:
static auto stepped_iota(int start, int end, int step) {
return std::ranges::views::iota(0, (end - start + step - 1) / step) |
std::ranges::views::transform([=](int x) { return x * step + start; });
}https://stackoverflow.com/questions/34544665
复制相似问题