使用 const 参数调用 map::find

2024-02-18

我有一个对象:

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(使用前将#替换为@)

使用 const 参数调用 map::find 的相关文章

随机推荐