I am trying (as an exercise) to create a simple number range class in C ++. This will allow you to iterate through evenly spaced pairs (e.g. numpy / Python arange):
What I would like to do (but with an iterator):
double lower = ..., upper = ..., delta = ...;
for (double val = lower; val < upper; val += delta)
{
f(val);
}
f(val);
Required equivalent iterator code:
double lower = ..., upper = ..., delta = ...;
NumericRange nr(lower, upper, delta);
for (NumericRange::const_iterator iter = nr.begin(); iter != nr.end(); iter++)
{
f(*iter);
}
I want my iterator to be compatible with STL iterators so that I can reuse the code (iterating through NumericRange should be equivalent to iterating through std :: vector).
I just managed to save the values ββin std :: vector (and then using the std :: vector iterator). This is how everything I found on the Internet solved this problem. However, there is no need to store the entire list.
? - iterable, ++, == .., std::vector<double>?
( , BOOST, . , ( ) - BOOST. , , , , .)
NumericRange ( std::vector<double> ):
class NumericRange
{
protected:
double lower, upper, delta;
std::vector<double> sorted_range;
public:
typedef std::vector<double>::const_iterator const_iterator;
NumericRange()
{
lower = upper = delta = std::numeric_limits<double>::quiet_NaN();
}
NumericRange(double lower_param, double upper_param, double delta_param)
{
lower = lower_param;
upper = upper_param;
delta = delta_param;
assert(upper_param > lower_param);
double val;
for (val = lower_param; val < upper_param; val += delta_param)
{
sorted_range.push_back(val);
}
sorted_range.push_back(val);
}
bool operator ==(const NumericRange & rhs) const
{
return lower == rhs.lower && upper == rhs.upper && delta == rhs.delta;
}
const_iterator begin() const
{
return sorted_range.begin();
}
const_iterator end() const
{
return sorted_range.end();
}
double get_lower() const
{
return lower;
}
double get_upper() const
{
return upper;
}
double get_delta() const
{
return delta;
}
size_t size() const
{
return sorted_range.size();
}
void print() const
{
std::cout << "[ " << lower << " : " << upper << ": +=" << delta << " ]" << std::endl;
}
};