2013-11-02 110 views
1

我正在處理由多個冗餘值組成的大文件(使用YAML的錨點和引用)。我在每個結構上做的處理都很昂貴,我想查看我是否正在查看對已經處理的錨點的引用。在Python中(使用python-yaml),我通過構建由id(節點)鍵入的字典來實現此目的。由於yaml-cpp使用Node作爲引用類型,但是,這似乎不適用於此。有什麼建議麼?如何判斷我是否已經處理了一個節點

這與Retrieve anchor & alias string in yaml-cpp from document類似,但雖然該功能足以解決我的問題,但它並不是必需的 - 例如,如果我可以以某種方式獲得基於節點內部地址的散列,例如,那將是精細。

我正在做的昂貴的事情是計算每個節點包括自己及其子女的散列。如果你試圖做這個節點的大名單上,檢查將有 -

Node a = ...; 
process(a); 
Node b = ...; 
if (!a.is(b)) { 
    process(b); 
} 

我想這是不完美:

回答

1

這裏是一個補丁,似乎做我所需要的。謹慎行事。

diff -nr include/yaml-cpp/node/detail/node.h new/yaml-cpp-0.5.1/include/yaml-cpp/node/detail/node.h 
a13 1 
#include <boost/functional/hash.hpp> 
a24 1 
      std::size_t identity_hash() const { return boost::hash<node_ref*>()(m_pRef.get()); } 
diff -nr /include/yaml-cpp/node/impl.h new/yaml-cpp-0.5.1/include/yaml-cpp/node/impl.h 
a175 5 
    inline std::size_t Node::identity_hash() const 
    { 
    return m_pNode->identity_hash(); 
    } 

diff -nr include/yaml-cpp/node/node.h new/yaml-cpp-0.5.1/include/yaml-cpp/node/node.h 
a55 2 
     std::size_t identity_hash() const; 

然後,我可以使用下面的使用YAML :: Node作爲關鍵字的unordered_map。

namespace std { 
    template <> 
    struct hash<YAML::Node> { 
    size_t operator()(const YAML::Node& ss) const { 
     return ss.identity_hash(); 
    } 
    }; 
} 
0

您可以通過operator ==Node::is,例如檢查節點標識爲O(n)。

如果您想要比這更多,請在項目頁面上提出問題。

+0

我真正需要的是專業化的std ::哈希這樣我就可以使用unordered_map的方式,所以很遺憾成對平等不會做太大。 – Alex

相關問題