有没有一种方便的方法可以从属性树中删除节点,同时保留其子节点
Is there a convenient way to erase a node from a property tree, preserving its child nodes?
我想从boost属性树中删除一个节点,但我想保留它的子节点,并将它们连接到已删除节点的父节点(即,连接到它们的祖父母节点)。有没有一种优雅的方式来实现这一点?
这可能是移动孙子的最有效方法:
std::move(middle.begin(), middle.end(), back_inserter(parent));
全样本
在Coliru上直播
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
using boost::property_tree::read_json;
using boost::property_tree::write_json;
int main() {
std::istringstream iss(R"({ "a" : { "middle" : { "a1":1, "a2":2, "a3":3 }, "more":"stuff" } })");
ptree pt;
read_json(iss, pt);
auto& parent = pt.get_child("a");
auto& middle = pt.get_child("a.middle");
std::move(middle.begin(), middle.end(), back_inserter(parent));
parent.erase("middle");
write_json(std::cout, pt);
}
json输出示例:
{
"a": {
"more": "stuff",
"a1": "1",
"a2": "2",
"a3": "3"
}
}
我不得不做一些类似的事情。
我使用了一个带有递归的迭代器,并在删除节点并将其分支回新创建的节点之前复制了子节点。
但我想,在移除之前,每棵树的完整副本都相当消耗资源,所以你只能用相对较小的树来完成,而且它并不是很优雅。
相关文章:
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 为什么"delete"关键字不删除节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 删除 XML 文件中的子节点C++
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 从unordered_map中删除单个节点
- 删除链表中的特定节点
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 使用函数引用指向节点的指针删除链表中的节点?
- 双向链表 - 无法删除第一个节点
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- BST 节点删除 - 指针未正确删除
- 节点删除功能的链表问题
- 布尔函数始终为真,单向链表中的尾节点删除创建无限循环
- AVL树中节点删除值异常