合并C 中的两个增强侵入性集
Merge two boost intrusive sets in C++?
我有两个提升侵入式集合,我需要将其合并在一起。我有map_old.m_old_attributes
提升侵入式套件,我需要将其合并到m_map_new_attributes
增强intruse Set
void DataTest::merge_set(DataMap& map_old)
{
// merge map_old.m_old_attributes set into m_map_new_attributes
}
最好的方法是什么?我找不到可以为我合并的函数吗?我最近开始使用Boost Intruse套装,但我找不到可以合并的预定义方法,或者我可能错了?
确实是侵入性的集合是另一种野兽。他们不管理元素分配。
因此,当合并时,您需要决定的含义。我想说一个合理的解释是,您要移动移动 map_old
容器内包含的元素进入数据amap。
这将使map_old
空。这是这样的算法:
template <typename Set>
void merge_into(Set& s, Set& into) {
std::vector<std::reference_wrapper<Element> > tmp(s.begin(), s.end());
s.clear(); // important! unlinks the existing hooks
into.insert(tmp.begin(), tmp.end());
}
更新另外您可以使用略带棘手的iterater-erase-loop(当心迭代突变容器): live live live 及
for (auto it = s.begin(); it != s.end();) { auto& e = *it; it = s.erase(it); into.insert(e); }
请参阅 Live on Coliru
#include <boost/intrusive/set.hpp>
#include <boost/intrusive/set_hook.hpp>
#include <string>
#include <vector>
#include <functional>
#include <iostream>
namespace bive = boost::intrusive;
struct Element : bive::set_base_hook<> {
std::string data;
Element(std::string const& data = "") : data(data) {}
bool operator< (Element const& rhs) const { return data < rhs.data; }
bool operator==(Element const& rhs) const { return data ==rhs.data; }
};
using Set = bive::set<Element>;
template <typename Set>
void merge_into(Set& s, Set& into) {
std::vector<std::reference_wrapper<Element> > tmp(s.begin(), s.end());
s.clear(); // important! unlinks the existing hooks
into.insert(tmp.begin(), tmp.end());
}
int main() {
std::vector<Element> va {{"one"},{"two"},{"three"},{"four"},{"five"},{"six"},{"seven"},{"eight"},{"nine"} };
Set a;
for(auto& v : va) a.insert(v);
std::vector<Element> vb {{"two"},{"four"},{"six"},{"eight"},{"ten"} };
Set b;
for(auto& v : vb) b.insert(v);
assert(9==a.size());
assert(5==b.size());
merge_into(a, b);
assert(a.empty());
assert(10==b.size());
}
当然,您可以为合并操作提出不同的语义(这更类似于"复制"而不是"移动")
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在for循环中包含两个索引值的测试条件
- 增强精神Qi-列表解析具有两个组件序列
- 合并C 中的两个增强侵入性集