ホームページ > バックエンド開発 > C++ > C std::maps でユーザー定義型をキーとして使用するにはどうすればよいですか?

C std::maps でユーザー定義型をキーとして使用するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-24 13:49:14
オリジナル
678 人が閲覧しました

How Can I Use User-Defined Types as Keys in C   std::maps?

std::maps のキーとしてのユーザー定義型

問題: C でユーザー定義型を持つマップを使用するときの不可解なコンパイラ エラー

プログラミングでは、ユーザー定義クラスで STL マップを使用すると、不可解なコンパイラ エラーが発生することがよくあります。具体的には、「'operator<' に一致しません」というエラー メッセージが表示されます。 in '__x < __y'" は、ユーザー定義型のキーを使用して要素にアクセスしようとする場合によく発生します。

エラーについて

エラー メッセージは、コンパイラがアクセスできないことを示しています。演算子 < を見つけます。ユーザー定義型の 2 つのインスタンスを比較します。これは、デフォルトでは、STL マップではキーの順序付けに比較演算子 (operator<) が必要であるためです。ただし、ユーザー定義型を使用する場合、この演算子は自動的には使用できません。

解決策 1: 比較関数オブジェクト

演算子を定義する代わりに

struct Class1Compare {
   bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
       return lhs.id < rhs.id;
   }
};

std::map<Class1, int, Class1Compare> c2int;ユーザー定義型の場合は、コンパレータ関数オブジェクト クラスを作成できます。このクラスは、ユーザー定義型の相対的な順序を決定する、operator() の特殊バージョンを実装します。次に、このコンパレータを使用するようにマップを特殊化できます。</p>
<h3></h3>
<p>解決策 2: std::less の特殊化</p>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
       bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
           return lhs.id < rhs.id;
       }
    };
}
ログイン後にコピー
もう 1 つの代替案は、ユーザー定義の std::less テンプレートを特殊化することです。タイプ。これにより、std::less クラス内でのoperator() のカスタム定義が提供されます:

このアプローチにより、ユーザーに特定の実装を提供しながら、比較のためにマップをデフォルトで std::less に設定できます。

結論

STL マップとユーザー定義型を扱う場合、キーを比較するメソッドを提供することが不可欠です。これは、コンパレータ関数オブジェクトを通じて、または std::less を特殊化することによって実現できます。この要件に対処することで、開発者はユーザー定義型をキーとして持つマップを効果的に利用できるようになります。

以上がC std::maps でユーザー定義型をキーとして使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート