我在这里有一个递归的函数,但我宁愿让它非递归。我只是不确定如何。
void AguiWidgetManager::recursiveRender(const AguiWidget *root)
{
//recursively calls itself to render widgets from back to front
AguiWidget* nonConstRoot = (AguiWidget*)root;
if(!nonConstRoot->isVisable())
{
return;
}
clip(nonConstRoot);
nonConstRoot->paint(AguiPaintEventArgs(true,graphicsContext));
for(std::vector<AguiWidget*>::const_iterator it =
root->getPrivateChildBeginIterator();
it != root->getPrivateChildEndIterator(); ++it)
{
recursiveRender(*it);
}
for(std::vector<AguiWidget*>::const_iterator it =
root->getChildBeginIterator();
it != root->getChildEndIterator(); ++it)
{
recursiveRender(*it);
}
}
如果解决方案不能与迭代器一起工作,那就没关系。
由于
答案 0 :(得分:6)
简单的方法就是维护自己的堆栈。 Psuedoish示例代码:
stack s;
while(!s.empty())
{
root = s.pop();
//your code here
//replace each recursive call with s.push(it)
}
此外,抛弃常量是一个坏主意。如果你想修改它,它首先不应该是一个const参数。
答案 1 :(得分:1)
通常,您需要自己实现堆栈:
clear stack
push first item onto stack
while stack is not empty:
pop top item off stack
do action for item (clip, paint)
push children onto stack (if any)