web-dev-qa-db-ja.com

std :: mapのキーとしてstd :: stringを使用する

Std :: map(int .NET 4.0)が欲しいのですが。もちろん、マップはツリーであり、文字列で定義されていない演算子<が必要であることはわかっています。

エラー24エラーC2676:バイナリ '<': 'const std :: string'は、この演算子または事前定義された演算子c:\ program files\Microsoft Visual Studio 10.0\vc\include\xfunctional125で受け入れ可能な型への変換を定義していません1 FXCMMarketDataServer

だから私は自分のgoogle-fooを動作させて、この解決策を見つけました:

struct StringComparerForMap
{
public:
    bool operator()(const std::string x, const std::string y)
    {
         // Add compare logic here
    }
};

...
std::map<std::string, CustomObject, StringComparerForMap> myMap;

これはしばらくの間正常に機能しましたが、これが原因であると思われるバグが発生しています。 STLフレームワークのどこかで、上記の定義を無視し、デフォルトでoperator <になっているように見えます。

VS2010 .NET 4.0で、マップのキーとして文字列を使用する方法はありますか?

その文字列を取得して、それをintにハッシュする関数を記述できることは理解していますが、その面白さはどこにありますか?

[〜#〜]編集[〜#〜]

デビッドのためにできる限りこれを説明しようと思います。マップが比較構造体を使用すると、リリース時にクラッシュし、デバッグでのデバッグアサーションに失敗します。失敗するアサートはxtree行1746にあります。

式:無効な演算子<

|中止| |再試行| |無視|

これが、マップに比較子を提供しているにもかかわらず、特定のパスをたどると、デフォルトで比較のためにoperator <になると私が信じる理由です。これを引き起こす私のコードの行は次のとおりです:

CustomObject o = stringObjectMap[key];
23
Steve H.

エラー24エラーC2676:バイナリ '<': 'const std :: string'は、この演算子または事前定義された演算子c:\ program files\Microsoft Visual Studio 10.0\vc\include\xfunctional125で受け入れ可能な型への変換を定義していません1 FXCMMarketDataServer

<string>を含めるのを忘れたときに、VCがあなたの顔に唾を吐きます。そのヘッダーは、この演算子を明確に定義しています。

70
sbi