gpt4 book ai didi

c++ - 在 C++ 中合并两个 boost 侵入集?

转载 作者:行者123 更新时间:2023-11-30 05:43:53 28 4
gpt4 key购买 nike

我有两个 boost intrusive sets,我需要将它们合并在一起。我有 map_old.m_old_attributes boost 侵入集,我需要将它合并到 m_map_new_attributes boost 侵入集

void DataTest::merge_set(DataMap& map_old)
{

// merge map_old.m_old_attributes set into m_map_new_attributes
}

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

最佳答案

事实上,侵入式设备是另一种野兽。他们不管理他们的元素分配。

因此,在合并时,您需要决定这意味着什么。我想说一个合理的解释是您想要将包含在 map_old 容器中的元素移动到 DataMap 中。

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

Update Alternately you can do it with O(1) memory complexity by using the slightly trickier iterater-erase-loop (beware of iterating mutating containers): Live On Coliru as well

    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++ - 在 C++ 中合并两个 boost 侵入集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30061052/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com