使用const参数调用map :: find

bar*_*son 5 c++ const

我有一个对象:

map<A*, string> collection;
Run Code Online (Sandbox Code Playgroud)

我想调用map :: find函数,但是我对key的值是const,就像下面的代码一样,它不能编译:

const A* a = whatever();
collection.find(a);
Run Code Online (Sandbox Code Playgroud)

以下代码工作并执行与查找操作等效的操作:

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)
Run Code Online (Sandbox Code Playgroud)

但它可能没有find成员函数那么高效,而且它也很丑陋,掩盖了代码的意图.

我怎样才能调用find函数?

谢谢

编辑:

我故意在地图中使用指针类型作为键.我想要的行为是地图使用键的指针相等.(就像在我的循环代码中一样)

Ros*_*ith 11

比较指针与它无关.OP可能需要也可能不需要自定义比较操作; 它看起来像他们只是通过它的地址寻找一个特定的对象,这似乎是完全合理的.前两个答案似乎错过了在手写搜索工作时find()无法编译的观点.

find()调用将无法编译,因为您传递的是错误的类型以进行搜索.map :: find()期望其参数与地图的键类型相同,即A*.你传递的是一个const A*,它不能隐式转换为A*(但与A*相当,这就是手写搜索的工作原理).隐式转换仅适用于另一个方向(A*到const A*,而不是const A*到A*).

可能你应该使用const A*而不是A*作为地图键; 根据您使用地图的内容,这可能也可能不实用.如果您需要将地图键设为A*,则需要将A*传递给find(),这意味着首先以A*作为搜索目标,或者只能从原始地方获取source作为const A*,使用find(const_cast <A*>(a))将其转换为指向非const的指针(与非const指针不同,这一点混淆了很多C/C++编码员).通常const_cast是不可取的,但这里它是安全的,因为你只是比较指针,而不是解除引用它.

  • map :: find()相对于简单的线性搜索的最大优点是,如果集合很大,它会快得多. (2认同)