我有一个对象:
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是不可取的,但这里它是安全的,因为你只是比较指针,而不是解除引用它.
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |