使用const参数调用map :: find

时间:2010-09-29 00:10:34

标签: c++ const

我有一个对象:

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成员函数那么高效,而且它也很丑陋,掩盖了代码的意图。

如何调用查找功能?

由于

修改

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

2 个答案:

答案 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) );