2

に情報を保持しようとしていますstd::map。しかし、私は問題がありfindます:

typedef map<string, string, equal_to<string>> MAP_STRING2STRING;
....
MAP_STRING2STRING map;
MAP_STRING2STRING::const_iterator iter;

を見つけようとするとkey、次のエラーが表示されます。

iter = map.find(key);

Visual C++ からのエラー
私は何を間違っていますか?
このエラーは、 に何かがある場合にのみ表示されmapます。

4

2 に答える 2

9

マップに間違った種類の比較ファンクターがあります。等式ではなく、厳密な弱い順序付け(より小さいまたはより大きい型の比較)が必要です。比較ファンクター パラメーターを省略して、より小さい比較を使用できますstd::string。これは、文字列の辞書式比較による厳密な弱い順序付けを実装します。

typedef map<string, string> MAP_STRING2STRING;

これは、

typedef map<string, string, less<string> > MAP_STRING2STRING;

内部的には、マップは両方の順序自体に対して厳密で弱い順序付けの比較を使用し、2 つのキーが等しいかどうかを判断します。

3 番目のテンプレート パラメーターを使用すると、カスタムの順序付け基準を使用してマップをインスタンス化できます。たとえば、これは上記のものとは逆の順序でマップを作成します。

typedef map<string, string, greater<string> > MAP_STRING2STRING;
于 2013-07-19T08:19:26.553 に答える
1

std::stringからへの単純なマップが必要な場合は、 (その偽の「コンパレーター」を削除してください) をstd::string使用してください。map<string, string>equal_to<string>

さらに、" " という名前の変数があるため、STLクラスmapと競合する可能性があります。map変数名を変更する (例: it と呼ぶ) か、クラスの名前空間プレフィックスをmyMap使用します。std::std::map

typedef map<string, string> MAP_STRING2STRING;
....
MAP_STRING2STRING myMap;

さらに、VS2010を使用しているエラーメッセージから、便利なautoC++ 11キーワードを使用して、の「混乱」を回避し、次MAP_STRING2STRING::const_iteratorを使用できます。

auto iter = myMap.find(someKey);
于 2013-07-19T08:24:45.350 に答える