如何使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
相关产品推荐
相关产品推荐

