对于我自己的练习,我正在编写XML解析器。为了填充树,我使用普通std::stack
并将当前节点作为最后一个顶级节点的子节点(应该是深度优先?)将其推到顶部。所以我现在对删除节点做同样的事情,我想知道是否有更快的方法
目前的删除代码:
struct XmlNode{
// ignore the rest of the node implementation for now
std::vector<XmlNode*> children_;
};
XmlNode* root_ = new XmlNode;
// fill root_ with child nodes...
// and then those nodes with child nodes and so fort...
std::stack<XmlNode*> nodes_;
nodes_.push(root_);
while(!nodes_.empty()){
XmlNode* node = nodes_.top();
if(node->children_.size() > 0){
nodes_.push(node->children_.back());
node->children_.pop_back();
}else{
delete nodes_.top();
nodes_.pop();
}
}
工作完全没问题,但有点看起来很慢。那么有没有更快/更好/更常见的方法呢?
答案 0 :(得分:2)
不要试图以迭代的方式做一些递归的事情,,除非你证明递归版本不够(例如堆栈溢出) )或更慢(除非您开始溢出堆栈,强制操作系统扩展或崩溃,否则不会发生)。
换句话说,通常,对线性结构使用迭代,对树结构使用递归。
Compared to recursion,迭代方法在我的机器上慢了大约3倍。如果你可以确定你的XML深度不会超过几百个嵌套(我从未在真实的XML文档中看到过),那么递归就不会有问题了。
迭代是人;归还,神圣。 :)