導入:なぜ透過的な比較が必要なのか?
皆さんはstd::mapやstd::setを使って検索をする際、キーの型がstd::stringであるにもかかわらず、検索のためにわざわざstd::stringの一時オブジェクトを作っていませんか?
実は、C++14から導入された「透過的な比較(Transparent Comparator)」を活用することで、この無駄な一時オブジェクトの生成を抑え、パフォーマンスを劇的に向上させることができます。特に大規模なデータセットを扱う場合、この小さな改善がメモリ効率や処理速度に大きな差を生みます。
基礎知識:透過的な比較とは何か?
通常、std::mapの比較関数であるstd::lessは、そのキーの型(例えばstd::string)を要求します。そのため、検索時にconst char(C言語由来の文字列など)を渡すと、std::mapは内部で「const charからstd::stringへの変換」を行い、一時的なオブジェクトを作成します。
透過的な比較とは、この「型の一致」という制限を取り払い、異なる型同士でも比較を可能にする仕組みです。これを利用することで、std::string型のマップに対してconst charを渡しても、型変換を介さずに直接比較ができるようになります。
実装:std::lessの活用
実装は非常に簡単です。std::mapやstd::setを宣言する際に、テンプレート引数の比較関数として、明示的に型を指定しないstd::less<>(菱形演算子)を指定するだけです。これにより、コンパイラが「型に依存しない比較」を自動的に選択してくれます。
サンプルプログラム
以下のコードをコピーして、C++14以降の環境でコンパイルして動作を確認してみてください。
include
include
コメント