他们为什么不添加 iota 的运营商版本?

Why didn't they add an operator version of iota?

本文关键字:运营商 版本 iota 为什么不 添加 他们      更新时间:2023-10-16

标准库中增加了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重载操作符++(),

将是方便的。我发现这个版本比默认的操作符++()版本更广泛地可用。& lt;

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

  • 没有人提交提案
  • 对于这个版本来说,它被认为不够重要(这已经是巨大的,而且很晚)
  • 它掉进了裂缝并被遗忘了(就像c++ 98中的copy_if)
  • 易于使用std::generate代替

对于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++;});
}