私は過去6年間ほとんど独占的にC#プログラマーでした。私は現在、C++が選択された言語であり、STLはコレクションのライブラリです。STLのフレームを採用するためのヒント
C#のLINQを使用した後、私はSTLフレームに入るのが非常に困難です。
例として:IEnumerator.Selectに相当するものを作成します。
C#
public static IEnumerator<Output> Select(this IEnumerator<Input> input, Func<Input, Output> func) {
while (input.MoveNext) {
yield return func(input.Current);
}
}
超簡単。
ここで、C++とSTLで同様のことを試してみてください。 (yieldキーワードと匿名関数の便利な構文の問題を除いて)。
多くの難しい質問にはじめて答える必要はありません。 STL列挙子はMoveNextではなく列挙子間の比較を使用するため、列挙子の終端値を決定する必要があります。それからあなたはイテレーターのすべてのナンセンスを混乱させる必要があります。 STLは実行時の動的ディスパッチの代わりにコンパイル時のテンプレートディスパッチを使用するため、イテレータは入力列挙子のvalue_typeだけでなく、特定の種類の入力列挙子にテンプレート化する必要があります。
STLでマップ結合イテレータを書き込もうとしていました。
他の人が書いたコードを見ると、Boostで拡張されていないSTLは、コレクションやソート以外のものではほとんど使用されないという結論に至りました。
私の近位の観測は以下のとおりです。
- 簡潔STLの変異イテレータを書くための方法はありますか?
- 1つのコレクションを他のコレクションに簡潔にソートコピーしますか?
- STLコードが簡潔ではないようです:
は、より一般的に、私は思考の私の慣れた方法と衝突するいくつかのことを気づきました。 STLコードを書くときに、簡潔なコードに責任を負うことを私の目的はしていますか? (簡潔ではないので、しばしば非常に長い型の識別子が含まれます)
- ブーストはSTLでアルゴリズムを書くのに近い要件のようです。 Boostの使用を許可されていない人はどうしますか?
いいえ、ストリームは壊れていますが、残りは正常です。 BoostとQTはどちらも、STLをはるかに大きなフレームワークに拡張します。一般的な拡張機能としてBoost、GUI関連のものについてはQTです。 'IEnumerator.Select'が正しく理解されていれば、' boost :: transform_iterator'を呼び出します。私が 'boost :: zip_iterator'を理解していれば、それはあなたのマップ結合反復子です。 –
私のプロジェクト要件はBoostを禁じていることに注意してください。 –
あなたは ''ヘッダが何を提供しているのかを見てください。 –
Attila