stack
定義一個用來存放字串物件的 stack 容器:
stack<string> words;
stack 容器介面卡的模板有兩個引數。第一個引數是儲存物件的型別,第二個引數是底層容器的型別。stack<T>
的底層容器預設是 deque<T>
容器,因此模板型別其實是 stack<typename T, typename Container=deque<T>>
。透過指定第二個模板型別引數,可以使用任意型別的底層容器,只要它們支援 back()
、push_back()
、pop_back()
、empty()
、size()
這些操作。下面展示瞭如何定義一個使用 list<T>
的堆疊:
stack<string,list<string>> fruit;
建立堆疊時,不能在初始化列表中用物件來初始化,但是可以用另一個容器來初始化,只要堆疊的底層容器型別和這個容器的型別相同。
list<double> values{1.414, 3.14159265, 2.71828};
stack<double, list<double>> my_stack(values);
第二條語句生成了一個包含 value 元素副本的 my_stack。這裡不能在 stack 建構函式中使用初始化列表;必須使用圓括號。如果沒有在第二個 stack 模板型別引數中將底層容器指定為 list,那麼底層容器可能是 deque,這樣就不能用 list 的內容來初始化 stack;只能接受 deque。
stack<T>
模板定義了複製建構函式,因而可以複製現有的 stack 容器:
stack<double,list<double>>copy_stack {my_stack}
copy_stack 是 my_stack 的副本。如你所見,在使用複製建構函式時,既可以用初始化列表,也可以用圓括號。
堆疊操作
和其他序列容器相比,stack 是一類儲存機制簡單、所提供操作較少的容器。下面是 stack 容器可以提供的一套完整操作:
top()
:返回一個棧頂元素的引用,型別為 T&。如果棧為空,返回值未定義。push(const T& obj)
:可以將物件副本壓入棧頂。這是透過呼叫底層容器的push_back()
函式完成的。push(T&& obj)
:以移動物件的方式將物件壓入棧頂。這是透過呼叫底層容器的有右值引用引數的push_back()
函式完成的。pop()
:彈出棧頂元素。size()
:返回棧中元素的個數。empty()
:在棧中沒有元素的情況下返回 true。emplace()
:用傳入的引數呼叫建構函式,在棧頂生成物件。swap(stack<T> & other_stack)
:將當前棧中的元素和引數中的元素交換。引數所包含元素的型別必須和當前棧的相同。對於 stack 物件有一個特例化的全域性函式 swap() 可以使用。