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

时间:2011-07-08 02:22:16

标签: c++ c++11 iota

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 ++()版本更广泛使用。 &LT;

2 个答案:

答案 0 :(得分:5)

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

  • 没有人提交提案
  • 对于这个版本(已经巨大,而且已经很晚),它被认为不够重要
  • 它落在了裂缝中并被遗忘(如C ++ 98中的copy_if
  • 使用std::generate轻松替换。

答案 1 :(得分:4)

使用lambda,第二个版本节省不多,你可以使用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++;});
}