关于指向const变量的指针的使用方法,以及从const std::unordered_map中根据id查找MyClass实例const指针的实现问题
关于指向const变量的指针使用,以及从const std::unordered_map中根据ID查找MyClass实例const指针的实现方案
嘿,我来帮你搞定这个问题!先理清楚你的需求:你现在有个const std::unordered_map<MyClass, std::size_t>存着MyClass实例和对应的ID,但需要写个函数根据ID反过来返回对应的MyClass对象的const指针对吧?我分两部分给你拆解:
一、指向const变量的指针基础用法
首先明确:MyClass const*(或者等价的const MyClass*)是指向const MyClass对象的指针,意思是你没法通过这个指针修改指向的对象——这正好匹配你的场景,因为你的myClassIds是const的,里面的所有MyClass实例也都是const的,返回这种指针能保证原对象不会被意外修改,完全符合const正确性的要求。
二、根据ID查找MyClass实例const指针的实现
你的原map是「MyClass实例 → ID」的映射,但你要的是「ID → MyClass实例」的反向查找,这里有两种方案:
方案1:构建反向映射(推荐,效率更高)
因为unordered_map是按键快速查找的,原结构反过来的话,直接用ID当键就能O(1)时间找到对应的MyClass实例,效率拉满。代码示例:
// 先预先构建ID到MyClass实例的反向const映射 const std::unordered_map<std::size_t, MyClass> idToMyClass = { {MyClass(1).getId(), MyClass(1)}, {MyClass(20).getId(), MyClass(20)} // 其他所有MyClass实例的映射 }; // 实现查找函数 MyClass const* findMyClass(std::size_t targetId) { // 在反向map里查找目标ID auto it = idToMyClass.find(targetId); if (it != idToMyClass.end()) { // map是const的,所以it->second是const MyClass,取地址就是符合要求的const指针 return &(it->second); } // 没找到对应ID时返回nullptr return nullptr; }
这里要注意:确保你的MyClass已经正确实现了哈希函数和相等运算符(operator==),不然unordered_map没法正常存储和查找。如果暂时不想写哈希,也可以改用std::map(它只需要operator<)。
方案2:基于原map遍历查找(适合不能修改原map的场景)
如果没法改原map的结构,那就只能遍历整个map,逐一比对ID:
// 基于原const map实现查找 MyClass const* findMyClass(std::size_t targetId) { for (const auto& entry : myClassIds) { // entry.first是MyClass实例,entry.second是对应的ID if (entry.second == targetId) { // 返回该实例的const指针 return &(entry.first); } } // 未找到返回nullptr return nullptr; }
这种方法是O(n)时间复杂度,适合map里元素不多的情况,元素多的话还是推荐方案1。
额外注意点
- 一定要保证
myClassIds(或者反向的idToMyClass)的生命周期足够长!如果它是某个函数里的局部变量,函数执行完后map会被销毁,返回的指针就会变成悬空指针,访问会导致未定义行为。最好把它定义成全局变量或者类的静态成员变量。 - 你的原map里用
MyClass(1)这种临时对象构造键值对,要确保MyClass的拷贝构造是正常工作的,不然map里存的实例可能会有问题。
备注:内容来源于stack exchange,提问作者A_brthr
相关产品推荐
相关产品推荐

