如何通过非boost::bimaps::bimap键类型查找元素
使用Boost.Bimap通过非键类型查找元素
我看你已经在着手解决用Boost.Bimap通过非键类型查找元素的问题了,你的思路是对的——自定义哈希和相等比较器来支持跨类型匹配,我来帮你补全代码并把整个流程说清楚。
首先,你的ExampleEq结构体只实现了同类型比较,还需要补充**Example和uint64_t之间的双向比较重载**,这样Boost.Bimap才能识别用uint64_t(也就是Example的id)查找Example键是合法的。先补全这个结构体:
struct ExampleEq { bool operator()(const Example& l, const Example& r) const { return l.id == r.id; } // 支持 Example 和 uint64_t 的交叉比较 bool operator()(const Example& l, uint64_t r_id) const { return l.id == r_id; } bool operator()(uint64_t l_id, const Example& r) const { return l_id == r.id; } };
接下来,定义bimap的时候,要把左视图的哈希器和比较器指定为你自定义的ExampleHash和ExampleEq。下面是完整的可运行代码:
#include <boost/bimap/bimap.hpp> #include <boost/bimap/unordered_multiset_of.hpp> #include <string> #include <iostream> using namespace boost::bimaps; using namespace boost; struct Example { uint64_t id; }; struct ExampleHash { uint64_t operator()(const Example& item) const { return item.id; } uint64_t operator()(const uint64_t item) const { return item; } }; struct ExampleEq { bool operator()(const Example& l, const Example& r) const { return l.id == r.id; } bool operator()(const Example& l, uint64_t r_id) const { return l.id == r_id; } bool operator()(uint64_t l_id, const Example& r) const { return l_id == r.id; } }; // 定义bimap类型 using MyBimap = bimap< unordered_multiset_of<Example, ExampleHash, ExampleEq>, unordered_multiset_of<std::string> >; int main() { MyBimap bm; // 插入测试元素 bm.insert(MyBimap::value_type(Example{123}, "test_item_1")); bm.insert(MyBimap::value_type(Example{456}, "test_item_2")); bm.insert(MyBimap::value_type(Example{123}, "test_item_3")); // 允许重复id的元素 // 用uint64_t类型的id查找左视图中的元素 auto match_range = bm.left.equal_range(123ULL); // 遍历输出匹配结果 for (auto it = match_range.first; it != match_range.second; ++it) { std::cout << "匹配到ID: " << it->left.id << ", 对应值: " << it->right << std::endl; } return 0; }
核心要点说明:
ExampleHash同时实现了Example和uint64_t的哈希计算,让Boost的无序容器能处理两种输入类型的哈希值生成。ExampleEq的交叉比较重载是关键,它告诉容器“Example对象和uint64_t的id是可以直接比较相等性的”。- 因为你用的是
unordered_multiset_of(允许多个相同id的元素),所以用equal_range获取所有匹配的元素范围;如果是unordered_set_of(唯一键),直接用find方法即可。
这样就能顺利实现用与键类型(Example)不同的uint64_t类型来查找bimap中的元素了。
内容的提问来源于stack exchange,提问作者AndyB
相关产品推荐
相关产品推荐

