Почему они не добавили операторскую версию йоты? - PullRequest
6 голосов
/ 08 июля 2011

Функция шаблона 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.Я бы нашел эту версию более широко используемой, чем версия оператора по умолчанию ++ ().<</p>

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Я подозреваю, что причиной является обычное сочетание одной или нескольких из следующих причин:

  • Никто не представил предложение
  • Это не считалось достаточно важным для этой версии (которая была уже огромной и очень поздней)
  • он провалился в трещины и был забыт (как copy_if в C ++ 98)
  • легко заменить, используя std::generate.
4 голосов
/ 08 июля 2011

С лямбдами вторая версия не сильно экономит, вы можете просто использовать 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++;});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...