gpt4 book ai didi

c++ - 使用 const 迭代器放置/删除属性树,或如何将 const_iterator 转换为迭代器

转载 作者:数据小太阳 更新时间:2023-10-29 02:53:39 25 4
gpt4 key购买 nike

我在带有 clang 3.4 的 ubuntu 12.04lts 上使用 boost 1.55.0。

我有一个 boost::property_tree::ptree 其 xml 输入如下所示:

<root>
<persons>
<person>
<name>dad</name>
<age>43</age>
</person>
<person>
<name>me</name>
<age>4</age>
</person>
</persons>
</root>

所以我有一个具有相同标签的节点列表。

为了阅读它们,我遍历了树,并根据条件删除了一个节点。这看起来像:

boost::property_tree::ptree pt;
boost::property_tree::read_xml(inputFileName, pt);

boost::property_tree::ptree& persons = pt.get_child("root");
for(boost::property_tree::ptree::const_iterator it = persons.begin(); it != persons.end(); ++it)
{
std::string name = it->second.get<std::string>("name");
if(name == "dad")
// erase that name node from pt
persons.erase(it->second.find("name"); // this doesn't work
}

[编辑]根据pmr的回答,我写了如下代码:

boost::property_tree::ptree::iterator i = persons.begin();
auto assoc_i = it->second.find("name");
auto ci = persons.to_iterator(assoc_i);
std::advance(i, std::distance<boost::property_tree::ptree::const_iterator>(iterator, ci)); // --> here it hangs
persons.erase(i);

现在它编译了,应用程序没有崩溃,但它卡在提到的位置。我不知道为什么。 [/编辑]

非常感谢。

最佳答案

您手头的问题与迭代器的常量无关,您只是在用错误的 ptree 迭代器删除。

ptree& persons = pt.get_child("root.persons");
for(auto it = persons.begin(); it != persons.end();) {
if(it->second.get<string>("name") == "dad")
it = persons.erase(it);
else
++it;
}

ptree 对子节点使用 multi_index,为了在删除过程中保持迭代稳定,您必须使用从 erase() 操作返回的迭代器来继续迭代,这是一种常见的模式。

注意问题中的 XML 有一个 / ( </age> ) 终止缺失,它不会验证。我不会编辑问题来修复它,因为这可能是您在执行程序时遇到的问题之一。

通过 write_xml(std::out, pt) 使用上述代码处理 ptree 的输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<persons>
<person>
<name>me</name>
<age>4</age>
</person>
</persons>
</root>

关于c++ - 使用 const 迭代器放置/删除属性树,或如何将 const_iterator 转换为迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21427518/

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