首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std:iota非常有限

std:iota非常有限
EN

Stack Overflow用户
提问于 2015-12-31 10:04:35
回答 2查看 6.9K关注 0票数 21

来自Python世界的我发现std::iota函数非常有限。为什么接口被限制为不接受任何UnaryFunction

例如,我可以转换

代码语言:javascript
复制
>>> x = range(0, 10)

转到

代码语言:javascript
复制
std::vector<int> x(10);
std::iota(std::begin(x), std::end(x), 0);

但人们会怎么做:

代码语言:javascript
复制
>>> x = range(0,20,2)

甚至是

代码语言:javascript
复制
>>> x = range(10,0,-1)

我知道编写这样一个函数或使用Boost是微不足道的,但我想C++委员会一定是谨慎地选择了这个设计。所以很明显,我错过了C++11的一些东西。

EN

回答 2

Stack Overflow用户

发布于 2015-12-31 10:17:38

std::generate怎么样?

代码语言:javascript
复制
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--;});
票数 36
EN

Stack Overflow用户

发布于 2020-12-13 16:52:35

使用C++20范围,您可以这样编写它:

代码语言:javascript
复制
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)) { ... }
}

https://godbolt.org/z/3G49rs

或者,如果你希望范围是有限的:

代码语言:javascript
复制
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; });
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34544665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档