なぜstd::map::containsを使うのか?
C++のプログラミングにおいて、std::mapなどの連想コンテナから特定のキーが存在するかを確認する処理は非常に頻繁に行われます。これまではstd::map::findメソッドを使い、戻り値がend()と等しいかどうかを比較するのが一般的でした。しかし、この方法はコードが冗長になりがちで、意図が直感的に伝わりにくいという課題がありました。C++20で導入されたstd::map::containsは、この「キーの存在確認」という目的を一行で、かつ明示的に表現できるため、コードの可読性を劇的に向上させます。
基礎知識:std::mapと検索の仕組み
std::mapは「キー」と「値」のペアを保持する連想コンテナで、内部的には二分探索木(主に赤黒木)として実装されています。そのため、要素の検索は対数時間(O(log n))で行われます。
従来使われてきたstd::map::findは、見つかった場合はその要素を指すイテレータを返し、見つからなかった場合はコンテナの終端を指すiterator(std::map::end)を返します。この「イテレータを介した比較」は、単に「存在するかどうかだけを知りたい」という場合には少し情報過多で、記述が長くなる要因となっていました。
実装と解決策
std::map::containsは、キーが存在する場合は「true」、存在しない場合は「false」を返します。findメソッドのように、返されたイテレータをend()と比較するステップが不要になります。これにより、条件分岐(if文)が非常にスッキリし、バグの混入リスクも低減します。
サンプルプログラム
以下のコードをコピーして、C++20対応のコンパイラで実行してみてください。
include
include
コメント