私は、Sieve of EratosthenesによってPythonで見たものに基づいて素数生成器を持っていますので、この生成器は基本的に良好なパフォーマンスで素数を生成します。私が望む何範囲ベースのループで別の演算子を使用
はので、ここで素数の範囲の範囲ベースのループを使用することです、私がやったことです:
//Consider prime_generator a class with both operator*, operator!= and operator< overloaded
class primes_range {
private:
unsigned int max;
public:
primes_range(unsigned int max) : max(max) {}
prime_generator begin() const {
return prime_generator(); //so this generator begin from 2 to
//infinity and beyond but of course
//all primes
}
prime_generator end() const {
prime_generator result;
for (:*result < max; ++result) {} //so this thing actually create a
//generator and increment it until it
//gives the first prime number
//above max so it basically do
//all the work that I don't
//want it to do now
return rest;
}
};
は、だから私のメインの中で、私は範囲ベースのループを使用したいと思います、それはprimes_rangeクラスのポイントです。もちろん
int main() {
for (auto && i : primes_range(10)) { //So here, this is silly because
//the range-based loop will use end()
//wich will calculate all the prime
//numbers at the very beginning
//and i will increment apart from
//this starting process
cout << i << endl;
}
return 0;
}
ではなく、私は単純なループを使用することができます。
int main() {
for (prime_generator pg; *pg < 10; ++pg) {
cout << *pg << endl;
}
return 0;
}
しかし、範囲ベースのループは読み、演算子*を使用することを防ぐことが容易であるので、私は代わりにそれを使用したいと思う
ので、私の質問です:範囲ベースのループを別の演算子を使用するようにする方法はあります=(この場合は<)?おそらくprimes_rangeの特定の関数をオーバーライドしたり、コンパレータを特化したりしますか?
いいえ。範囲ベースループの意味はそのまま定義されており、カスタマイズすることはできません。唯一のカスタマイズポイントは、開始値と終了値です。 –
'primes_range'を再設計する必要があります。 'prime_generator'を返す代わりに、それはラッパーを返すべきです。 –
T.C. ? – Steranoid