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

その理由は、次の1つ以上の理由の通常の組み合わせであると思われます。

  • 誰も提案を提出しなかった
  • このバージョンでは十分に重要であるとは見なされていませんでした(すでに巨大で、非常に遅い)
  • それは亀裂を通り抜けて忘れられました(copy_ifC ++ 98のように)
  • を使用して簡単に交換できstd::generateます。
于 2011-07-08T16:25:56.807 に答える
4

ラムダでは、2番目のバージョンはあまり節約できません。使用するだけ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 に答える