c ++ map没有返回值

时间:2012-12-01 08:13:20

标签: c++ stl map

为什么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;
}

需要额外的文字发布&gt;。&lt;

糟糕!您的问题无法提交,因为:

您的帖子没有太多上下文来解释代码部分;请更清楚地解释一下你的情景。

4 个答案:

答案 0 :(得分:4)

它失败,因为您使用char *指针作为键。对于两个文字地址将是不同的。要使地图正常工作,您必须使用其他一些具有运算符&lt;定义。例如std :: string。

答案 1 :(得分:2)

此类型:

std::map< char*,  int>;

表示该键是一个指针,它不是一个字符串。这意味着它是一个指针。要更好地理解它,请考虑以下事项:

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

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

为什么最后一行无效?好吧,两者都是指针,并指向一些内存位置,对吧?假设编译器不优化字符串常量,因此"abc" "abc"的地址会有所不同。因此比较将失败。

你会说,你会使用strcmp。究竟!这就是重点,map::find不知道是否使用字符串比较例程!它只是比较两个指针,你得到无效的结果。因此,最好使用字符串类(std::string),或将比较器传递给map

答案 2 :(得分:1)

//这会返回0而不是24

printf(“来自测试:%d \ n”,test-&gt; get(“aaa”));

因为“aaa”的内存地址与您存储的地图不同,

mm [“aaa”] = 24并且get(“aaa”)不是同一个指针。

答案 3 :(得分:0)

不要将指针值用作map / hash的键。 键类型,也许你可以使用std :: string。

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

PS:

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

我认为,无论p1是否等于p2,很难说,这取决于编译器的实现。