深度理解:使用字符串作为STL中map对象的key

深度理解:使用字符串作为STL中map对象的key

作者:BlogUpdater |  时间:2018-08-26 |  浏览:2734 |  评论已关闭 条评论

考察一下两个代码片段:

void Fun1()
{
	map<CString, int> test;
	test[_T("dll")] = 1;
	test[_T("exe")] = 1;

	map<CString, int>::const_iterator it =  test.find(_T("dll"));
	if (it != test.end())
	{
		AfxMessageBox(_T("Key value found"));
	}
	else
	{
		AfxMessageBox(_T("Key value NOT found"));
	}
}
void Fun2()
{
	map<LPCTSTR, int> test;
	test[_T("dll")] = 1;
	test[_T("exe")] = 1;

	map<LPCTSTR, int>::const_iterator it =  test.find(_T("dll"));
	if (it != test.end())
	{
		AfxMessageBox(_T("Key value found"));
	}
	else
	{
		AfxMessageBox(_T("Key value NOT found"));
	}
}

实验结果
1) Fun1将打印:Key value found。
2) Fun2将打印:Key value NOT found。<== 奇怪,为什么会找不到?

结果分析
1) 先分析Fun1,其声明的map对象的key为一个CString对象,其值类型为int。当使用find方法查询值时,将根据CString的字符串值进行查找匹配,因key “dll”已经存在于map对象中,所以指定的元素存在,故程序输出:Key value found。
2) 再来看Fun2,直觉上,其结果应该和Fun1一致。但是,注意了,这里的key的类型是LPCTSTR,也即是指向一个字符串的指针地址,这个地址充当了这个map对象的key,当我们向find方法传入_T(“dll”)时,虽然字符串的字面值一致,但是其地址已经不一样了,所以,find方法尝试使用字符串指针地址进行查询匹配时,就找不到指定的元素了。

我们可以通过VS的调试环境观察map对象的内部结构:

1) Fun1

2) Fun2

总结
如有需要使用字符串作为map对象的key,请认准:map<CString, XXX>。

标签:

评论已关闭。