C++中map<char*,char*>问题,高手指点下,小女子感激不尽

#include <string>
#include <iostream>
#include <fstream>
#include <iterator>
#include <map>

using std::string;
using namespace std;

int main(void) {
int count = 0;
map<char*, char*> mymap;
map<char*, char*>::iterator it;

mymap.insert(pair<char*,char*>("a","abc"));
mymap.insert(pair<char*,char*>("b","def"));
mymap.insert(pair<char*,char*>("c","100"));
//查询方式一:
cout<<mymap["a"]<<endl;
//查询方式二:
char *p = "a";
cout<<mymap[p]<<endl;
//查询方式三:
string key = "a";
cout<<mymap[const_cast<char*>(key.c_str())]<<endl;
//查询方式四:
char *p2 = const_cast<char*>(key.c_str());
cout<<mymap[p2]<<endl;
return 0;
}

上面的四个方式中,只有前两个能查出值来。
可是第三和第四中的关键字,也是char*的,为什么查找时,返回的是空。
strlen后,得到的*p和*p2是一样长度,值也一样
请高手指导一下。

另,如果思路是有问题的话,怎么样才能让一个string的变量,转为char*后,在map中查到相应的值呢。

再次感谢各位。

第1个回答  2013-08-27
因为, map查找char *实际是根据指针地址是否相同来比较的. 比如说"a", 编译器认为两个"a"是相同的, 并且一开始就分配在了内存中, 所以他们的地址是相同......其他两种, 指针地址改变了, 虽然指向的都是a字符串

C++中map<char*,char*>问题,高手指点下,小女子感激不尽
因为, map查找char *实际是根据指针地址是否相同来比较的. 比如说"a", 编译器认为两个"a"是相同的, 并且一开始就分配在了内存中, 所以他们的地址是相同...其他两种, 指针地址改变了, 虽然指向的都是a字符串

C++中函数strcmp的问题。
二维指针,不要太在意这种东西,这可能只有中国的考试中才会用到。

c++中 ofstream.open(char*) 的问题
ofstream output;output.open(filename.c_str());

NOIP中C++的问题
C++程序中禁止使用下列模板:序列:vector,list,deque 序列适配器:stack,queue,priority_queue 关联容器:map, multimap, set, multiset 拟容器:valarray 散列容器:hash_map, hash_set, hash_multimap, hash_multiset 所有的标准库算法。C++程序中只能使用下列合法基本数据类型 名称 长度 ch...

...栈计算后辍表达式值的程序,请把错误和为什么错写出来,感激不尽...
char a[1000];\/\/int i,n,a,b,c;上面已经定义了一个字符数组a了,这里就不能定义int的a了,我改了个b1 ,下面有个d,所以着就加了个d,顺便初始化下 int i,n,b1,b,c,d;d=0;\/\/strcpy(a[],B); 字符数组做参数时会自动转成指针 strcpy(a,B);n=strlen(B);for(i=0;i<n;i++...

const_cast<char *>(a)和(char*)a区别在哪里?
const_cast<char *>(a) 是c++中的语法。 将a转为 char* 类型。 const_cast 表示将a转化为非常量指针 多用来修饰 const属性的 (char*)a 表示将a转化为 char*类型 没有别的含义。

C++中char类型转化成const char*类型中的问题。
10(char ch)……这是一处错误。int _16_To_10需要的是char,不是const char 其次,你想把char转换成const char*这个想法就不对,前者是字符,后者是只读字符地址。字符怎么能直接类型转换成地址呢?如果你想要地址的话,可以用&这个字符变量,比如&data[i]。char*是可以类型转换为const char*。

sprintf_s函数问题,求大神解答,在线,感激不尽。
如果这样,可能sprintf_s被重载了。比如 int func(char *, int size, char *fmt, ...);int func(char *, char *fmt, ...);

c++中 map里upper_bound和lower_bound分别怎么理解啊? 主要是想问关键...
在map里面 m.lower_bound(键) 就是大于或等于键值的第一个迭代器, m.lower_bound(键) 是大于键值的下一个迭代器。比方说 (键1, 值2)(键2, 值4)(键4, 值9)(键5, 值9)若m.lower_bound(3) 由于有键3,所以的他值就是键3 的迭代器 m.lower_bound(3) 无论有没有...

c++中,string可以拿char*初始化么?
可以。请看下面的举例代码:\/\/#include "stdafx.h"\/\/If the vc++6.0, with this line.#include <iostream>using namespace std;int main(void){ char *p="1234567890"; string str(p);\/\/str=p也行 cout << p << endl; return 0;}输出是1234567890....

相似回答