C++中如何通过HashMap的值获取对应键?有无非遍历内置方法?
C++ 通过值查找HashMap键的方法
首先明确:C++标准库中的std::unordered_map(即你说的HashMap)没有内置的无需遍历就能通过值获取对应键的函数。因为它的底层结构是为「键查值」做优化的,反向查找不在设计目标里。
替代方案
1. 直接遍历容器
这是最直接的方法,遍历整个unordered_map,比对每个元素的值,找到匹配的键:
#include <unordered_map> #include <iostream> int main() { std::unordered_map<int, std::string> my_map = {{1, "apple"}, {2, "banana"}, {3, "cherry"}}; std::string target_val = "banana"; for (const auto& pair : my_map) { if (pair.second == target_val) { std::cout << "找到的键:" << pair.first << std::endl; break; // 如果值唯一,找到就退出 } } return 0; }
如果存在多个键对应同一个值,去掉break即可收集所有匹配的键。
2. 维护反向映射
如果需要频繁通过值查键,可以提前维护一个反向的映射容器:
- 若值唯一,用
std::unordered_map<Value, Key>; - 若值可能重复,用
std::unordered_multimap<Value, Key>,支持一个值对应多个键。
示例(值唯一的场景):
#include <unordered_map> #include <iostream> int main() { std::unordered_map<int, std::string> forward_map = {{1, "apple"}, {2, "banana"}, {3, "cherry"}}; std::unordered_map<std::string, int> reverse_map; // 初始化反向映射 for (const auto& pair : forward_map) { reverse_map[pair.second] = pair.first; } // 通过值查键 std::string target_val = "banana"; auto it = reverse_map.find(target_val); if (it != reverse_map.end()) { std::cout << "找到的键:" << it->second << std::endl; } return 0; }
这种方法后续查找的时间复杂度和正向查找一致为O(1),但需要额外内存存储反向映射,且正向映射更新时要同步维护反向映射。
3. 第三方双向映射容器
若不想手动维护反向映射,可使用第三方库的双向映射容器(比如Boost库的boost::bimap),但这需要引入外部依赖,标准库本身没有这类容器。
内容的提问来源于stack exchange,提问作者MOHAMED RIZWAN S
相关产品推荐
相关产品推荐

