我有一个对象:
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 成员函数高效,而且它也很丑陋并且掩盖了代码的意图。
如何调用查找函数?
谢谢
编辑:
我有意为 map 中的键使用指针类型。我想要的行为是 map 对键使用指针相等性。 (就像在我的循环代码中一样)
最佳答案
比较指针与它无关。 OP 可能需要也可能不需要自定义比较操作;在我看来,他们只是通过地址寻找特定对象,这似乎非常合理。前两个答案似乎忽略了 find() 在手写搜索有效时无法编译的要点。
find()
call 不会编译,因为您传递给它的是错误的搜索类型。 map::find()
期望其参数与 map 的键类型相同,即 A*
.你传递的是 const A*
,它不能隐式转换为 A*
(但与 A*
相当,这就是手写搜索有效的原因)。隐式转换仅适用于另一个方向( A*
到 const A*
,而不是 const A*
到 A*
)。
可能你应该使用 const A*
而不是 A*
作为映射键;根据您使用 map 的目的,这可能实用也可能不实用。如果您需要映射键为 A*
, 你需要传递一个 A*
至 find()
,这意味着要么以 A*
开头首先作为您的搜索目标,或者如果您只能从其原始来源获取它作为 const A*
, 使用 find(const_cast<A*>(a))
将它变成指向非常量的指针(这与非常量指针不同,这一点让很多 C/C++ 编码人员感到困惑)。通常const_cast
这是不可取的,但在这里它是安全的,因为您只是比较指针,而不是取消引用它。
关于c++ - 使用 const 参数调用 map::find,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817910/