5

プログラムに辞書を実装するためにC++マップを使用しています。structure.name私の関数は引数として構造体を取得し、メンバーに基づいて関連付けられた値を返す必要がありchar named[32]ます。次のコードは私の問題を示しています。

map <const char *, const char *> myMap;
myMap.insert(pair<const char *, const char *>("test", "myTest"));

char *p = "test";
char buf[5] = {'\0'};
strcpy(buf, "test");

cout << myMap.find(p)->second << endl; // WORKS
cout << myMap.find("test")->second << endl; // WORKS
cout << myMap.find(buf)->second << endl; // DOES NOT WORK

3番目のケースが機能しない理由と、それを機能させるにはどうすればよいかわかりません。上記のコードをデバッグして、渡された値を監視しましたが、それでも問題を理解できません。

ありがとう!

4

4 に答える 4

9

文字列の比較ではなく、ポインターの比較がmap要素の位置を特定するために実行されます。最初の 2 つ"test"は文字列リテラルであり、同じアドレスを持つため機能します。bufは と同じアドレスを持たないため、最後の は機能しません"test"

修正するには、 を使用するstd::stringか、 のコンパレータを定義しますchar*

于 2012-04-05T20:45:59.560 に答える
5

マップ キーはポインタであり、値ではありません。リテラルの「テスト」文字列はすべてストレージを共有します。コンパイラはそのように賢いため、それらのポインターは同じですbufが、異なるメモリアドレスです。

std::stringの代わりになど、値が等しいセマンティクスを持つマップ キーを使用する必要がありますchar*

于 2012-04-05T20:46:03.040 に答える
1

前述のように、値ではなくアドレスで比較しています。この記事をリンクしたかった:

c++の文字列リテラルは静的メモリに作成されていますか?

すべてのリテラルが同じアドレスを持っていたので、これは、基になる型がまだ a であるにもかかわらず、文字列リテラルの比較が機能した理由を説明していますconst char *(ただし、コンパイラによっては、常にそうであるとは限りません)。

于 2012-04-05T20:55:50.273 に答える