私は過去 6 年間、ほぼ独占的に C# プログラマーでした。私は現在、C++ が最適な言語であり、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 の代わりに列挙子間の比較を使用するため、列挙子の最終値を決定する必要があります。次に、すべての iterator_traits ナンセンスを台無しにする必要があります。STL は実行時の動的ディスパッチではなく、コンパイル時のテンプレート ディスパッチを使用するため、入力列挙子の value_type だけでなく、特定の種類の入力列挙子についても反復子をテンプレート化する必要があります。
STL で map-join イテレータを書こうとしたときから始めないでください。
他の人が書いたコードを見て、Boost で拡張されていない STL は、コレクションとソート以外にはめったに使用されないという結論に達しました。
私の近位観察は次のとおりです。
- STLで突然変異イテレータを簡潔に書く方法はありますか?
- あるコレクションを別のコレクションに簡潔に並べ替えるにはどうすればよいでしょうか?
より一般的には、私の慣れ親しんだ考え方と衝突するいくつかのことに気付きました。
- STL コードは簡潔ではないようです。簡潔なコードを書くという私の目的は、STL コードを書くときに問題になりますか? (簡潔ではないということは、つまり、非常に長い型識別子が含まれることが多いということです)
- ブーストは、STL でアルゴリズムを記述するためのほぼ必須のようです。Boost の使用を許可されていない人は何をしますか?