You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:44