[解決済み] C++とPythonの等価なジェネレータパターン
2022-06-27 21:09:10
質問
私は、C++で模倣する必要があるいくつかのPythonコードの例を持っています。私は特定のソリューションを必要としません (共同ルーチン ベースの収量ソリューションなど、それらもまた許容される回答でしょうが)、私は単に何らかの方法でセマンティクスを再現する必要があります。
Python
これは基本的なシーケンスジェネレータで、実体化したバージョンを保存するには明らかに大きすぎます。
def pair_sequence():
for i in range(2**32):
for j in range(2**32):
yield (i, j)
目標は、上記のシーケンスの2つのインスタンスを維持し、半ロックステップで、しかしチャンクでそれらを繰り返し処理することです。以下の例では
first_pass
はバッファを初期化するためにペアのシーケンスを使用します。
second_pass
を再生成します。
同じ正確なシーケンス
を再生成し、バッファを再び処理します。
def run():
seq1 = pair_sequence()
seq2 = pair_sequence()
buffer = [0] * 1000
first_pass(seq1, buffer)
second_pass(seq2, buffer)
... repeat ...
C++
C++での解決策としては、以下のような模倣しかありません。
yield
を C++ のコルーチンで模倣することですが、これを行う方法についての良いリファレンスは見つかっていません。また、この問題に対する代替(一般的でない)解決策にも興味があります。私は、パス間でシーケンスのコピーを保持するのに十分なメモリ予算を持っていません。
どのように解決するのですか?
ジェネレータはC++でも別の名前で存在しています。
入力イテレータ
. 例えば
std::cin
のジェネレータを持つのと同じです。
char
.
単純にジェネレータが何をするものかを理解する必要があります。
- データの塊があり、ローカル変数で 状態
- init メソッドがあります。
- next"メソッドがあります。
- 終了を通知する方法があります。
あなたの些細な例では、それは十分に簡単です。概念的には
struct State { unsigned i, j; };
State make();
void next(State&);
bool isDone(State const&);
もちろん、これをちゃんとしたクラスとしてラップします。
class PairSequence:
// (implicit aliases)
public std::iterator<
std::input_iterator_tag,
std::pair<unsigned, unsigned>
>
{
// C++03
typedef void (PairSequence::*BoolLike)();
void non_comparable();
public:
// C++11 (explicit aliases)
using iterator_category = std::input_iterator_tag;
using value_type = std::pair<unsigned, unsigned>;
using reference = value_type const&;
using pointer = value_type const*;
using difference_type = ptrdiff_t;
// C++03 (explicit aliases)
typedef std::input_iterator_tag iterator_category;
typedef std::pair<unsigned, unsigned> value_type;
typedef value_type const& reference;
typedef value_type const* pointer;
typedef ptrdiff_t difference_type;
PairSequence(): done(false) {}
// C++11
explicit operator bool() const { return !done; }
// C++03
// Safe Bool idiom
operator BoolLike() const {
return done ? 0 : &PairSequence::non_comparable;
}
reference operator*() const { return ij; }
pointer operator->() const { return &ij; }
PairSequence& operator++() {
static unsigned const Max = std::numeric_limts<unsigned>::max();
assert(!done);
if (ij.second != Max) { ++ij.second; return *this; }
if (ij.first != Max) { ij.second = 0; ++ij.first; return *this; }
done = true;
return *this;
}
PairSequence operator++(int) {
PairSequence const tmp(*this);
++*this;
return tmp;
}
private:
bool done;
value_type ij;
};
そうですね...C++の方が少し冗長かもしれませんね :)
関連
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Python 3 の "python -m SimpleHTTPServer" に相当するものは何ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。