-1

为什么我的测试里面的地图没有返回它的值?这有什么问题?

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* 指针作为键。对于两个文字地址将是不同的。要使地图正常工作,您必须使用其他一些已定义 operator< 的字符串类。例如,std::string。

于 2012-12-01T08:17:27.020 回答
2

这个类型:

std::map< char*,  int>;

说 key 是一个指针,它不是一个字符串。这意味着它是一个指针。为了更好地理解它,请考虑以下内容:

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

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

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

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

于 2012-12-01T08:38:33.537 回答
1

//这将返回 0 而不是 24

printf("来自测试:%d\n", test->get("aaa"));

因为“aaa”的内存地址和你存储的map不同,

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 回答