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

如何使boost::bimap<multiset_of<int>,multiset_of<int>>元素唯一?

嘿,针对你这个Boost.Bimap多集合去重的问题,我来给你梳理下解决方案!

首先明确一点:Boost.Bimap 并没有为 multiset_of 类型的双向映射提供内置的去重函数——毕竟 multiset_of 的设计初衷就是允许重复键值对存在的。不过我们可以通过两种简单的方式手动实现去重,同时完全保留你要求的 multiset_of 类型定义。

方法1:利用临时 set_of Bimap 中转(最简洁)

这种方法借助了 set_of 类型Bimap自动去重的特性,只需要两步就能搞定:先把原多集合Bimap的元素导入到临时的set_of Bimap里完成去重,再把去重后的元素导回你需要的multiset_of Bimap中。

代码示例:

#include <boost/bimap.hpp>
#include <boost/bimap/multiset_of.hpp>
#include <boost/bimap/set_of.hpp>

// 定义你需要的多集合双向映射类型
typedef boost::bimap<boost::bimaps::multiset_of<int>, boost::bimaps::multiset_of<int>> MultiBiMap;
// 临时用的唯一元素双向映射类型
typedef boost::bimap<boost::bimaps::set_of<int>, boost::bimaps::set_of<int>> UniqueBiMap;

int main() {
    MultiBiMap bm;
    // 这里模拟你的填充逻辑,比如从向量插入元素
    // for(int j = 0; j < matching1.size(); j++){
    //     bm.insert({matching1[j], matching2[j]});
    // }
    // 先手动加几个测试元素
    bm.insert({6, 71});
    bm.insert({6, 71});
    bm.insert({6, 71});
    bm.insert({8, 71});
    bm.insert({8, 71});
    bm.insert({10, 71});
    bm.insert({10, 74});

    // 步骤1:用原Bimap初始化临时set_of Bimap,自动去重
    UniqueBiMap temp_bm(bm.begin(), bm.end());

    // 步骤2:清空原多集合Bimap,重新插入去重后的元素
    bm.clear();
    bm.insert(temp_bm.begin(), temp_bm.end());

    // 现在bm里的元素就是唯一的了:6<->71、8<->71、10<->71、10<->74
    return 0;
}
方法2:手动遍历+记录已存在元素(更灵活)

如果你不想依赖额外的set_of类型,可以手动遍历原Bimap,用一个std::set来记录已经处理过的键值对(Boost.Bimap的元素类型MultiBiMap::value_type支持比较,可以直接存入std::set),只插入从未出现过的元素到新的多集合Bimap中。

代码示例:

#include <boost/bimap.hpp>
#include <boost/bimap/multiset_of.hpp>
#include <set>

typedef boost::bimap<boost::bimaps::multiset_of<int>, boost::bimaps::multiset_of<int>> MultiBiMap;

int main() {
    MultiBiMap bm;
    // 填充元素逻辑...

    std::set<MultiBiMap::value_type> seen_elements;
    MultiBiMap unique_bm;

    // 遍历原Bimap,只保留首次出现的元素
    for (const auto& elem : bm) {
        if (seen_elements.find(elem) == seen_elements.end()) {
            seen_elements.insert(elem);
            unique_bm.insert(elem);
        }
    }

    // 把去重后的结果赋值给原Bimap(用move避免拷贝开销)
    bm = std::move(unique_bm);
    return 0;
}

小提示

  • 两种方法都能保证最终的Bimap是你需要的multiset_of类型,完全符合场景要求。
  • 方法1更简洁,利用了Boost.Bimap本身的类型特性;方法2适合需要自定义去重逻辑的场景(比如如果以后要修改去重规则)。

内容的提问来源于stack exchange,提问作者Jordan Palmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:38:11