std::map の char* キーの複雑さ
std::map のようなハッシュベースのコンテナを扱う場合、キーを理解するタイプが重要です。次のコードに示すように、マップ キーとして char* を使用する場合、特有の問題が発生します。
std::map<char*, int> g_PlayerNames;
このコードは、プレーヤー名 (char*) をキーとして、対応する整数を値として保存しようとします。ただし、既知の名前を使用してエントリを検索すると、比較が失敗し、予期しない結果が生じます。
根本的な原因は、キーとしての char の特殊な性質にあります。 std::map は、デフォルトで小なり演算子 (<) を使用してキーを比較します。ただし、char ポインターの場合、この比較では、ポインターが指す文字列ではなくポインター アドレスがチェックされます。
この問題を解決するには、文字列ではなく実際の文字列に対して動作するカスタム比較関数を提供する必要があります。ポインタ。次のような構造体を導入すると、これを行うことができます。
struct cmp_str { bool operator()(char const *a, char const *b) const { return std::strcmp(a, b) < 0; } };
このカスタム比較関数を提供することで、参照する文字列に基づいて char* キーを比較するように std::map に指示し、正しいキーを保証します。
そこで、元のマップ定義を使用する代わりに、比較を含めるように変更します。 function:
mapg_PlayerNames; この変更により、プレーヤー名の検索と更新ロジックは意図したとおりに機能し、文字列の内容に基づいて char* キーを照合する比較関数を利用します。
以上が`std::map` で `char*` キーが失敗する理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。