在C ++中合并两个boost invasive集合?

时间:2015-05-05 18:55:47

标签: c++ boost set intrusive-containers boost-intrusive

我有两个提升侵入式设置,我需要将它们合并在一起。我有map_old.m_old_attributes提升侵入式设置,我需要将其合并到m_map_new_attributes提升侵入式设置

void DataTest::merge_set(DataMap& map_old)
{

    // merge map_old.m_old_attributes set into m_map_new_attributes
}

最好的方法是什么?我无法找到可以为我合并的功能?我最近开始使用boost入侵集,我无法找到可以进行合并的预定义方法,或者可能是我错了?

1 个答案:

答案 0 :(得分:1)

确实,侵入式集合是一种不同的野兽。他们不管理他们的元素分配。

因此,在合并时,您需要确定的含义。我想说一个合理的解释是你希望将<{1}}容器中包含的元素移动到数据集中。

这会使map_old为空。这是一个这样的算法:

map_old
  

更新或者,您可以使用稍微棘手的iterater-erase-loop(谨防迭代变异容器)来实现O(1)内存复杂性:Live On Coliru as well

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());
}

查看 Live On Coliru

    for (auto it = s.begin(); it != s.end();) {
        auto& e = *it;
        it = s.erase(it);
        into.insert(e);
    }

当然,你可以为合并操作提出不同的语义(更像是'copy'而不是'move')