ACE篇之六 ACE容器之二(棧)

2021-05-04 06:41:44 字數 1417 閱讀 9090

1、前言

棧是lifo序列(後進先出),ace既支援動態棧,也支援靜態棧,靜態棧的尺寸固定,使用代價較低。ace提供了兩種靜態棧:有界棧ace_bounded_stack和固定棧ace_fixed_stack。動態棧在每次插入時候分配記憶體,每次彈出時候釋放該記憶體,即無界棧ace_unbounded_stack型別。

有界棧和固定棧的區別在於:有界棧是在執行時固定下來的,方法是把尺寸作為引數傳遞給棧的構造器:

ace_bounded_stackbstack(100);

固定棧的尺寸是在編譯時確定的,在內部,固定棧使用的是乙個陣列。

ace_fixed_stackbstack1;

而無界棧ace_unbounded_stack內部實際上使用的是乙個鍊錶表示,因此有意思的是,除了常規彈出操作外,也可以用迭代器遍歷無界棧。

2、測試全部源**,含有全部注釋

#define ace_ntrace 0

#include "ace/containers_t.h"

class dataelement;

class stacktests

}//第二個有界棧棧宣告:值容器

ace_bounded_stackbstack2(100);

//棧複製:深度複製--元素全部複製過來

bstack2=bstack1;  

while(!bstack2.is_empty())

ace_debug((lm_debug,ace_text("/n")));

return 0;

}//固定棧測試

//固定棧也是一種靜態棧

//固定棧與有界棧的區別是:它是在宣告時,用模板引數設定棧大小,而有界棧則在宣告時需要進行初始堆分配

int runfixedstack(void)

for(int j=0;j<100;j++)

ace_debug((lm_debug,ace_text("/n")));

//離開作用域,棧將被銷毀(元素在出棧後已經銷毀:delete element;)

return 0;

}//無界棧實際上內部使用的是一種鍊錶表示

//因此我們可以用迭代器來遍歷棧中的每乙個元素

//當然按照使用棧的慣例,我們一般不使用迭代器來遍歷這些元素,而是用彈出的方式來使用

int rununboundedstack(void)

//棧使用的常規方法:彈出

while(!ustack.is_empty())

ace_debug((lm_debug,ace_text("/n")));

//使用迭代器來遍歷棧中的元素

//ace_unbounded_stack_iteratoriter(ustack);

//for(iter.first();!iter.done();iter.advance())

//   }};

ACE篇之十一 ACE容器之六(自調整的二叉樹)

1 ace提供的樹實現為紅黑樹,名為ace rb tree,介面與對映表類似,其實現實際上是乙個值容器。型別定義是 ace rb tree 2 測試類 tree practice.h include ace rb tree.h include dataelement.h 紅黑樹型別封裝成助手模板類l...

ACE篇之九 ACE容器之四(集合)

1 前言 集合是不允許其所含條目重複的序列。ace有兩種集合 有界集合和無界集合,即ace bounded set和ace unbounded set。它們支援插入 查詢 迭代。2 測試完整源 如下 原書本有多處錯誤 include ace containers.h include dataelem...

ACE篇之九 ACE容器之五(集合)

1 前言 集合是不允許其所含條目重複的序列。ace有兩種集合 有界集合和無界集合,即ace bounded set和ace unbounded set。它們支援插入 查詢 迭代。2 測試完整源 如下 原書本有多處錯誤 include ace containers.h include dataelem...