如何判断我是否已处理节点
How to tell if I've already processed a node
我正在处理由许多冗余值组成的大文件(使用 YAML 的锚点和引用)。我对每个结构所做的处理都很昂贵,我想检测我是否正在查看对我已经处理过的锚点的引用。在Python(使用python-yaml)中,我通过简单地构建一个由id(node)键控的字典来做到这一点。但是,由于yaml-cpp使用Node作为引用类型,因此这似乎在这里不起作用。有什么建议吗?
这类似于从文档中检索yaml-cpp中的锚点和别名字符串,但是尽管该功能足以解决我的问题,但这不是必需的 - 例如,如果我可以根据节点的内部地址以某种方式获得哈希,那就好了。
我正在做的昂贵的事情是计算每个节点的哈希值,包括它自己和它的子节点。
这是一个补丁,似乎可以满足我的需要。请谨慎操作。
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();
}
};
}
您可以通过operator ==
或Node::is
来检查节点身份,例如:
Node a = ...;
process(a);
Node b = ...;
if (!a.is(b)) {
process(b);
}
我想这并不完美 - 如果您尝试在大量节点上执行此操作,则检查必须是 O(n)。
如果您想要更多,请在项目页面上提交问题。
相关文章:
- 是否可以在c++中处理字符串流中的各个元素
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 如何判断SSL_read是否已经接收并处理了来自单个消息的所有记录
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- clang++ 是否以更轻松的方式处理系统标头?
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 瓦尔格林德:注意到但未处理的国际奥克特尔;是否有必要处理以及如何找到?
- 在 C++17 中,是否未定义使用无锁原子学保护从信号处理程序传递的数据?
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- grpcc++异步服务器示例,在处理状态下是否需要互斥
- 是否有可以处理方法调用依赖关系的设计模式?
- STD ::分配器是否处理C 17中的过度对准类型
- 在执行其中的代码之前,是否处理了 if 中的所有逻辑 OR 分隔检查?
- 在展开宏之前是否处理了预处理器指令
- 片段着色器是否处理顶点着色器中的所有像素
- 默认复制构造函数是否处理常量