1

多くの冗長な値で構成される大きなファイルを処理しています (YAML のアンカーと参照を使用)。各構造で行う処理はコストがかかるため、既に処理したアンカーへの参照を見ているかどうかを検出したいと考えています。Python (python-yaml を使用) では、id(node) をキーとする辞書を作成するだけでこれを行いました。ただし、yaml-cpp は参照型として Node を使用するため、これはここでは機能しないようです。助言がありますか?

これはRetrieve anchor & alias string in yaml-cpp from documentに似ていますが、その機能は私の問題を解決するのに十分ですが、ノードの内部アドレスに基づいて何らかの方法でハッシュを取得できれば、必須ではありません。たとえば、それでいいでしょう。

私が行っている高価なことは、それ自体とその子を含む各ノードのハッシュを計算することです。

4

2 に答える 2

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();
    }
  };
}
于 2013-11-03T00:09:47.747 に答える
0

operator ==またはでノード ID を確認できますNode::is。例:

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

これは完璧ではないと思います。ノードの大きなリストでこれを実行しようとしている場合、チェックは O(n) である必要があります。

これ以上のものが必要な場合は、プロジェクト ページで問題を報告してください。

于 2013-11-02T16:48:28.583 に答える