Как создать последовательность значений, указав начальное, конечное значение и шаг? - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно сгенерировать последовательность чисел, имеющую начальное, конечное значение и шаг, с помощью которого будут сгенерированы числа. Например, на языке Haskell это тривиальная проблема, и она называется арифметической последовательностью. .

[1..10] = [1,2,3,4,5,6,7,8,9,10]

Я попытался реализовать это следующим образом.

namespace utility {
  template<class Container, class Type>
    Container generator(Type t_from, Type t_to, Type t_step = 1)
    {
      // Sequence storage container
      Container sequence_of_numbers { };
      sequence_of_numbers.reserve(static_cast<std::size_t>(std::abs(t_to - t_from + 1)) / t_step);

      // For floating point data
      if constexpr (std::is_floating_point_v<Type>) {
        // The reverse sequence
        if((t_to - t_from) < 0) {
          for(Type i = t_from; ; i -= t_step) {
            if(i > t_to) {
              sequence_of_numbers.push_back(static_cast<typename Container::value_type>(i));
            } else {
              if(std::fabs(i - t_to) < std::numeric_limits<Type>::epsilon()) {
                sequence_of_numbers.push_back(i);
              }
              break;
            }
          }
        // The direct sequence
        } else {
          for(Type i = t_from; ; i += t_step) {
            if(i < t_to) {
              sequence_of_numbers.push_back(static_cast<typename Container::value_type>(i));
            } else {
              if(std::fabs(i - t_to) < std::numeric_limits<Type>::epsilon()) {
                sequence_of_numbers.push_back(i);
              }
              break;
            }
          }
        }
      // Integer data type
      } else {
        if((t_to - t_from) < 0) {
          for(Type i = t_from; i >= t_to; i -= t_step) {
            sequence_of_numbers.push_back(static_cast<typename Container::value_type>(i));
          }
        } else {
          for(Type i = t_from; i <= t_to; i += t_step) {
            sequence_of_numbers.push_back(static_cast<typename Container::value_type>(i));
          }
        }
      }

      sequence_of_numbers.shrink_to_fit();

      return sequence_of_numbers;
    }
}

И при следующем вызове получаю желаемый результат.

std::vector<int> full_reverse_sequence { utility::generator<std::vector<int>>(10000, 0) };

Есть ли что-то подобноев C ++ 17 / C ++ 20, на уровне синтаксиса или библиотеки STL?

1 Ответ

0 голосов
/ 26 октября 2019

Я думаю, std :: iota делает то, что вам нужно.

Или вы можете использовать std :: generate или std :: generate_n с простой лямбдой

Больше сказать нечего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...