我有一个对象:
map<A*, string> collection;
我想调用 map::find 函数,但我的键值是 const,如以下代码所示,该代码无法编译:
const A* a = whatever();
collection.find(a);
以下代码可以工作并执行与查找操作等效的操作:
const A* a = whatever();
map<A*, string>::iterator iter;
for(iter = collection.begin(); iter != collection.end(); ++iter)
if(iter->first == a)
break;
// iter now contains the result or map::end (just like map::find)
但它可能不如 find 成员函数那么高效,而且它也很丑陋并且掩盖了代码的意图。
如何调用查找函数?
Thanks
Edit:
我故意使用指针类型作为映射中的键。我想要的行为是让映射对键使用指针相等。 (就像我的循环代码一样)
比较指针与此无关。 OP 可能需要也可能不需要自定义比较操作;在我看来,他们只是通过地址寻找特定的对象,这似乎完全合理。前两个答案似乎忽略了一点:当手写搜索有效时, find() 无法编译。
The find()
call 不会编译,因为您向其传递了错误的搜索类型。map::find()
期望其参数与映射的键类型相同,即A*
。你正在传递一个const A*
,它不能隐式转换为A*
(但相当于A*
,这就是手写搜索有效的原因)。隐式转换仅适用于另一个方向(A*
to const A*
, not const A*
to A*
).
也许你应该使用const A*
代替A*
作为地图键;这可能实用,也可能不实用,具体取决于您使用地图的用途。如果您需要地图键A*
,你需要通过一个A*
to find()
,这意味着要么以A*
首先作为您的搜索目标,或者您只能从其原始来源作为const A*
, using find(const_cast<A*>(a))
将其转换为指向非常量的指针(这与非常量指针不同,这一点让很多 C/C++ 程序员感到困惑)。通常const_cast
不可取,但在这里它是安全的,因为您只是比较指针,而不是取消引用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)