我有一个对象:
map<A*, string> collection;
我想调用map :: find函数,但是我对key的值是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成员函数那么高效,而且它也很丑陋,掩盖了代码的意图。
如何调用查找功能?
由于
修改
我故意在地图中使用指针类型作为键。我想要的行为是地图使用键的指针相等。 (就像在我的循环代码中一样)
答案 0 :(得分:11)
比较指针与它无关。 OP可能需要也可能不需要自定义比较操作;它看起来像他们只是通过它的地址寻找一个特定的对象,这似乎是完全合理的。前两个答案似乎错过了在手写搜索工作时find()无法编译的程度。
find()
调用将无法编译,因为您传递了错误的类型进行搜索。 map::find()
期望其参数与地图的键类型相同,即A*
。您正在传递const A*
,该A*
不可隐式转换为A*
(但与A*
相当,这就是手写搜索的原因)。隐式转换仅适用于其他方向(const A*
至const A*
,而不是A*
至const A*
。)
您可能应该使用A*
代替A*
作为地图密钥;根据您使用地图的内容,这可能也可能不实用。如果您需要地图密钥为A*
,则需要将find()
传递给A*
,这意味着首先从const A*
开始作为您的搜索目标,或者如果你只能从它的原始来源find(const_cast<A*>(a))
获取它,使用const_cast
把它变成一个指向非const的指针(与非常量指针不同,这让很多C / C ++编码器感到困惑。通常{{1}}是不可取的,但在这里它是安全的,因为你只是比较指针而不是解除引用它。
答案 1 :(得分:1)
您可以随时删除const
const A* a = whatever();
collection.find( const_cast<A*>(a) );