6

iota 模板函数被添加到标准库中,以用递增的值序列填充迭代器范围。

  template<typename ForwardIterator, typename Tp>
    void
    iota(ForwardIterator first, ForwardIterator last, Tp value)
    {
      for (; first != last; ++first)
        {
          *first = value;
          ++value;
        }
    }

大多数其他模板<numeric>都有接受用户指定运算符的版本。有这个:

  template<typename ForwardIterator, typename Tp, typename Operator>
    void
    iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op)
    {
      for (; first != last; ++first)
        {
          *first = value;
          op(value);
        }
    }

如果您不想(或不能)为 Tp 重载 operator++() 会很方便。我会发现这个版本比默认的 operator++() 版本更有用。<

4

2 回答 2

5

我怀疑原因通常是以下一个或多个原因的混合:

  • 没有人提交提案
  • 对于这个版本,它被认为不够重要(已经很大,而且很晚)
  • 它从裂缝中掉下来并被遗忘(就像copy_if在 C++98 中一样)
  • 使用 . 替换很容易std::generate
于 2011-07-08T16:25:56.807 回答
4

使用 lambdas,第二个版本并没有节省太多,你可以使用std::generate.

template<typename ForwardIterator, typename Tp, typename Operator>
void iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op)
{
  std::generate(first, last, [&value,&op](){auto v = value; op(value); return v;});
}

事实上,这使得现有的实现std::iota非常多余:

template<typename ForwardIterator, typename Tp>
void iota(ForwardIterator first, ForwardIterator last, Tp value)
{
  std::generate(first, last, [&value](){return value++;});
}
于 2011-07-08T02:31:50.817 回答