C++で簡単な数値範囲クラスを作成しようとしています。それはあなたが(/ Pythonのarange
numpyのように)等間隔のダブルスを反復させます:内部でstd :: vectorやstd :: listを使わないC++ std :: iterator
私がやりたい(ただし、イテレータを)したいもの:
double lower = ..., upper = ..., delta = ...;
for (double val = lower; val < upper; val += delta)
{
// do something with val
f(val);
}
// include the last val to guarantee upper is included or exceeded
f(val); // do something with val
希望同等のイテレータコード:
double lower = ..., upper = ..., delta = ...;
NumericRange nr(lower, upper, delta);
for (NumericRange::const_iterator iter = nr.begin(); iter != nr.end(); iter++)
{
f(*iter);
}
私は(にNumericRangeを反復することはITERと同等である必要があり、私は、コードを再利用することができますので、私のイテレータはSTLのイテレータと互換性がしたいのですがatdからstd :: vectorまで)。
私はstd :: vector(そしてstd :: vectorのイテレータを使って)に値を格納するだけで成功しました。これは私がオンラインで見つけたすべてがこの問題を解決した方法です。ただし、リスト全体を格納する必要はありません。
値全体を格納しないようにする方法はありますか? std::vector<double>
を保存せずに希望の効果を得るには、iterable
クラスが継承してから継承できるクラスがありますか?++
、==
などをオーバーライドしますか?
(私は本当にそれは素晴らしいことだにもかかわらず、BOOSTせずにこれを行う方法を知っているように思います。私は)ゼロから(のようなものをの書き方を学びたいと思いますので、私はこれを聞いていますのよBOOSTソリューション私は間違いなく、ソフトウェアエンジニアリングの一部が他の人が作成したツールを使用しているけど、私は実際にそれらのツールを設計・構築されている方法を学びたい)
内部std::vector<double>
を使用して私の反復可能にNumericRangeクラス()。。:
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();
// vector is constructed empty
}
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;
// note: can be much faster without push_back
for (val = lower_param; val < upper_param; val += delta_param)
{
sorted_range.push_back(val);
}
// ensure the upper_value is contained or surpassed
sorted_range.push_back(val);
}
// to prevent comparison of the entire vector
bool operator ==(const NumericRange & rhs) const
{
return lower == rhs.lower && upper == rhs.upper && delta == rhs.delta;
}
// note: this class doesn't really need to store the values in a
// vector, but it makes the iterator interface much easier.
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;
}
};
宗教上の理由から、 –
@MrListerそれは主に冗談として意図されましたが、上記の説明を追加しました。 – user
OK。ねえ、私はライブラリを使うのではなく、自分で何かしたいと思っていることに対して何もしていません。あなたが言ったように、それが「エクササイズ」である限り、ホイールを再発明することさえできます。しかし、その後、あなたは "宗教的理由"を言うようになったので、Boostにいくつかの根本的な問題があるかもしれないと思った。 –