[英]property tree put/erase with const iterator, or how to convert const_iterator to iterator
我正在使用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);
現在可以編譯了,應用程序也不會崩潰,但是掛在了前面提到的位置。 而且我不知道為什么。 [ /編輯 ]
提前謝謝了。
容器的C ++ 11 API指定成員函數iterator container::erase(const_iterator, const_iterator)
。 不幸的是, basic_ptree
不能做到這一點,因此您basic_ptree
將const_iterator
轉換為iterator
舊C ++方法:
// tree is your ptree, my_const_iter a ptree::const_iterator
ptree::iterator i = tree.begin();
advance (i, std::distance<ConstIter>(i,my_const_iter));
您眼前的問題與迭代器的穩定性無關,您只是用錯誤的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,並且為了使迭代在擦除過程中保持穩定,您必須使用從delete()操作返回的迭代器繼續進行迭代,這是一種常見的模式。
請注意 ,問題中的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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.