c++ - 使用 const 参数调用 map::find

标签 c++ constants

我有一个对象:

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/

相关文章:

iphone - 如何在 iOS 上使用 NSLog 打印字符串常量

c++ - 为什么 C++ std::exception::what 成员常量?

c++ - 自定义类的 const 实例化是否也使类中的 *everything* 成为常量?

C++)为什么 const int*& 参数不能采用 int* 参数?

ruby - 为什么要私有(private)封装私有(private)常量?

C++ 'invalid conversion from ‘void*’ 到 ‘crypto_aes_ctx*’

c++ - 对 main() 返回的值感到困惑

c++ - 两个交替的字符如何高效或者不循环输出?

c++ - C++ 17 中的并行执行策略

c++ - 用C++将OpenCV帧写入磁盘:单线程写入速度是否受磁盘吞吐量的限制?