Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147665
  • 博文数量: 27
  • 博客积分: 531
  • 博客等级: 一等列兵
  • 技术积分: 332
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-25 18:31
文章分类

全部博文(27)

文章存档

2015年(4)

2014年(3)

2013年(6)

2012年(14)

我的朋友

分类: C/C++

2012-11-04 16:28:27

    好久都没有在这里写blog了,当然我没有忘记这里,只是比较懒散,一点一点的都推迟了。
    今天在写一点东西,用到了map,遇到点问题,所以对map做了进一步的了解,故此在这里作一个记录。

代码说明一切:

点击(此处)折叠或打开

  1. #include <map>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;

  5. class comp
  6. {
  7. public:
  8.     bool operator()(char* x, char* y) {
  9.         return (strcmp(x, y) > 0);
  10.     }
  11. };

  12. int main()
  13. {
  14.     map<char*, char*, comp>* pm = new map<char*, char*, comp>();
  15.     // map<char*, char*>* pm = new map<char*, char*>();

  16.     char* k1 = (char*)"abc";
  17.     char* k2 = (char*)"def";

  18.     pm->insert(pair<char*, char*>(k1, (char*)"123"));
  19.     pm->insert(pair<char*, char*>(k2, (char*)"456"));

  20.     char* k = new char[4];
  21.     strcpy(k, k1);
  22.     // char* k = (char*)"abc";
  23.     map<char*, char*>::iterator it = pm->find(k);

  24.     if (it != pm->end()) {
  25.         cout << it->second << endl;
  26.     }

  27.     return 0;
  28. }
如果使用 map<char*, char*, comp>* pm = new map<char*, char*, comp>(); 这个定义,则可以得到
想要查询的结果。
反之,要是使用
map<char*, char*>* pm = new map<char*, char*>(); 则不能查找到结果。
原因很明显,因为内置的比较函数只是作数值比较,也就是说比较的是地址。

但是有一点是值得注意的,如果另 char* k = (char*)"abc";这样即使使用后一种的map声明也是可以查到
结果的,这应该是编译器将常量统一到一个地址,而比较的是指针所值的地址。这个值得注意。

好了,就说这么多,欢迎拍砖。
阅读(1457) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~