前言
? ? ? ?vector容器的數據結構原型是順序表,它很好的實現了順序表的功能,大大方便了編程。好了,現在假設有天我又想用棧,那么有沒有棧對應的容器呢?很遺憾,木有。但基于“棧”可以由順序表或者鏈表實現這一特性,C++提供了stack給我們使用,來解決棧的實現這個問題。stack可不是類,也不是容器,那它是什么呢?它就是本文要討論的一個新的類型 --- 容器適配器。
什么是容器適配器?
? ? ? ?容器適配器是對容器的一種再封裝。不同的容器適配器提供不同的函數,使容器的功能得到全新的特定的擴展。(但它和容器的容器是有區別的:容器適配器不支持迭代器和算法,使用起來限制比較大)。標準庫提供了三種容器適配器:queue,stack和priority_queue。
容器適配器怎么用?
? ? ? ?一般來說,先定義一個容器,接著給該容器配備相應的容器適配器,然后就可以使用該容器適配器特有的函數處理數據了。這里可以省略掉容器定義那一步,容器適配器將自動分配容器。下面這個代碼示范了棧容器適配器stack的用法。我們先定義一個vector容器,接著給該vector容器分配stack容器適配器,然后使用棧容器提供的函數自頂向下的輸出所有元素,解決了前言所提出的問題:
1 #include <iostream> 2 #include <vector> 3 // 使用容器適配器必須包含相應的頭文件 4 #include <stack> 5 6 using namespace std; 7 8 int main() 9 { 10 vector<int> v; 11 12 /* 13 * 將0-9存入vector容器并打印 14 */ 15 for (int i=0; i<10; i++) 16 v.push_back(i); 17 cout << "輸出Vector容器:" << endl; 18 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 19 cout << *it << " "; 20 cout << endl << endl; 21 22 // 給容器v配上容器適配器 23 stack< int, vector<int> > s(v); 24 /* 25 * 使用棧容器適配器stack提供的函數處理數據 26 */ 27 cout << "自頂向下輸出棧( stack容器適配器 ):" << endl; 28 while (!s.empty()) { 29 cout << s.top() << " "; 30 s.pop(); 31 } 32 cout << endl; 33 34 return 0; 35 }
? ? ? ?運行結果:
說明
? ? ? ?1. 容器適配器只適用于一定的容器而不是所有容器。
? ? ? ?2. 容器適配器的函數實現其實也是基于其參數容器的函數,而不是自己重新定義的。