簡體   English   中英

使用const迭代器放置/擦除屬性樹,或如何將const_iterator轉換為迭代器

[英]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_ptreeconst_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM