stack

N1ce2cu發表於2024-08-20

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() 可以使用。