2013-12-18 44 views
0

儘管有通常的進程用戶堆棧,我仍然需要另一個堆棧,例如。一個明確可訪問的。例如,這將允許遞歸步行暫停,恢復,拆分以及零件從一個線程移動到另一個線程。在C++中實現另一個用戶堆棧

如果我們有:

void recurse(Node& n) 
{ 
    n.calculate(); 

    for(Node& child: n.children) 
     recurse(child); 
} 

那麼我們可以這樣做:

void recurse(Stack& stack) 
{ 
    Node& n=stack.peek(); 
    n.calculate(); 

    for(Node& child: n.children) 
    { 
     stack.push(child); 
     recurse(stack); 
     stack.pop(); 
    } 
} 

recurse過程可以轉化爲一個迭代,然後通過pauseing擴展,分裂等

但是,如何實現Stack,如果節點可以是abitrary,Node衍生類,使用虛擬函數nctions和子類依賴的大小?

+3

你必須自己實現它,還是允許使用'std :: stack <>'? –

+0

這裏通常的解決方案是指向對象的(智能)指針的集合,以避免切片問題。 –

+0

std :: stack將被實例化爲一個給定類型,例如'Node',然後無法處理任何其他大小猜測的'Node'派生對象。 – dronus

回答

2

您可以簡單地使用std::stack<Node*>或理想的owning_pointer<Node>而不是Node*

+0

這不會像用戶堆棧那樣以有效的方式使用連續內存,而是反覆保留和釋放堆內存,因爲Node子類實體必須由'new'保存。 – dronus