снова из академического интереса, и, вероятно, сгибая предполагаемый дизайн std::iota
до предела:
std::iota(x.begin(), x.end(), double_iota(step, min));
со следующими определение double_iota:
struct double_iota
{
double_iota(double inc, double init_value = 0.0) : _value(init_value), _inc(inc) {}
operator double() const { return _value; }
double_iota& operator++() { _value += _inc; return *this; }
double _value;
double _inc;
};
Программа
Тест:
#include <algorithm>
#include <numeric>
#include <vector>
#include <iostream>
#include <iterator>
struct double_iota
{
double_iota(double inc, double init_value = 0.0) : _value(init_value), _inc(inc) {}
operator double() const { return _value; }
double_iota& operator++() { _value += _inc; return *this; }
double _value;
double _inc;
};
int main()
{
double min = 1.0;
double max = 2.3;
double step = 0.2;
std::vector<double> x(std::size_t(((max + step - std::numeric_limits<double>::epsilon()) - min)/step));
std::iota(x.begin(), x.end(), double_iota(step, min));
std::copy(x.begin(), x.end(), std::ostream_iterator<double>(std::cout, ", "));
}
Ожидаемые результаты:
1, 1.2, 1.4, 1.6, 1.8, 2, 2.2,
обновление:
или мы можем построить пользовательский итератор, который позволяет нам выразить последовательность действительно в одной строке:
std::vector<double> x(double_inc_iterator(min, step), double_inc_iterator(max));
as foll РМО:
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
struct double_inc_iterator : std::iterator<std::forward_iterator_tag, double>
{
double_inc_iterator(double initial, double inc = 1.0) : _value(initial), _inc(inc) {}
value_type operator*() const { return _value; }
double_inc_iterator& operator++() { _value += _inc; return *this; }
bool operator==(double_inc_iterator const& r) const { return _value >= r._value; }
bool operator!=(double_inc_iterator const& r) const { return !(*this == r); }
value_type _value;
value_type _inc;
};
int main()
{
double min = 1.0;
double max = 2.3;
double step = 0.2;
std::vector<double> x(double_inc_iterator(min, step), double_inc_iterator(max));
std::copy(x.begin(), x.end(), std::ostream_iterator<double>(std::cout, ", "));
}
Теперь мы даже не нужен промежуточный вектор:
std::copy(double_inc_iterator(min, step),
double_inc_iterator(max),
std::ostream_iterator<double>(std::cout, ", "));
петля ......... –
Конечно. Но могу ли я избежать цикла? – Aleph0
Почему .............? –