-1

Test 内のマップが値を返さないのはなぜですか? これの何が問題なのですか?

class Test{ //Test.h
public:
  std::map< char*,  int> mm;

  Test();
  void set();
  int get( char*);
};

Test::Test(){ //Test.cpp
}

void Test::set(){
  mm["aaa"] = 24;
}

int Test::get( char* n){
  return mm[n];
}

int main(){ //main.cpp
   Test *test = new Test();
   test->set();

   //this returns 0 instead of 24
   printf("From Test: %d\n", test->get("aaa"));
   printf("From Test: %d\n", test->mm["aaa"]);

   delete test;

   //this map works
   std::map<char*, int> mm;
   mm["a"] = 54;

   printf("Local: %d\n", mm["a"]);

   return 0;
}

投稿するには追加のテキストが必要です >.<

おっとっと!次の理由により、質問を送信できませんでした:

あなたの投稿には、コード セクションを説明するコンテキストがあまりありません。シナリオをより明確に説明してください。

4

4 に答える 4

4

char* ポインターをキーとして使用しているため、失敗します。2 つのリテラルのアドレスは異なります。マップを適切に機能させるには、operator< が定義されている他の文字列クラスを使用する必要があります。たとえば、std::string です。

于 2012-12-01T08:17:27.020 に答える
2

このタイプ:

std::map< char*,  int>;

キーはポインタであり、文字列ではないと言います。つまりポインタです。よりよく理解するために、次のことを考慮してください。

char* p1, *p2;
p1 = "abc";
p2=  "abc";

if (p1==p2) // THIS IS INVALID

最後の行が無効なのはなぜですか? どちらもポインタであり、何らかのメモリ位置を指していますよね? コンパイラが文字列定数を最適化しないため、 と のアドレスが異なると仮定し"abc" ます "abc"。したがって、比較は失敗します。

strcmp代わりに, を使用すると言うでしょう。丁度!それが要点map::findです。文字列比較ルーチンを使用するかどうかはわかりません! 2 つのポインターを比較するだけで、無効な結果が得られます。したがって、文字列クラス ( std::string) を使用するか、コンパレータを に渡すことをお勧めしmapます。

于 2012-12-01T08:38:33.537 に答える
1

//これは 24 ではなく 0 を返します

printf("From Test: %d\n", test->get("aaa"));

「aaa」のメモリアドレスが格納するマップと異なるため、

mm["aaa"] = 24 と get("aaa") は同じポインターではありません。

于 2012-12-01T09:50:44.520 に答える
0

ポインター値をマップ/ハッシュのキーとして使用しないでください。キーの種類。おそらく std::string を使用できます。

map<string, int> mm; // this would work.

PS:

p1 = "abc";
p2=  "abc";

p1がp2に等しいかどうかは、コンパイラの実装次第だとは言い難いと思います。

于 2012-12-01T16:01:07.843 に答える