容器的 front、back 及操作方向
1.1vector(動態數組)
結構:連續內存塊,支持快速隨機訪問。
操作方向:
front:第一個元素(索引 0)。
back:最后一個元素(索引 size() - 1)。
push_back():在尾部插入元素。
pop_back():從尾部刪除元素。
不支持頭部操作(如 push_front() 或 pop_front())。
#include <vector>
vector<int> v = {10, 20, 30};v.push_back(40); // 尾部插入 → [10,20,30,40]
v.pop_back(); // 尾部刪除 → [10,20,30]/*圖示如下入隊方向 →→→→→→→→→→
front → [10][20][30] ← back↑ ↑push_back/pop_back出隊方向←←←←←←←←←←←
*/
1.2queue(隊列,FIFO)
結構:默認基于 deque 實現的容器適配器,嚴格遵循先進先出。
操作方向:
front:隊列頭部(最早插入的元素)。
back:隊列尾部(最新插入的元素)。
push():在尾部插入元素。
pop():從頭部刪除元素。
#include <queue>
queue<int> q;q.push(10); // 隊列 → [10]
q.push(20); // 隊列 → [10,20]
q.pop(); // 刪除頭部 → [20]
/*圖示如下入隊方向 →→→→→→→→→→[10][20][30][40][50]↑ ↑front back
出隊方向 →→→→→→→→→→
*/
1.3list(雙向鏈表)
結構:由雙向鏈表節點構成,每個節點包含前后指針。
操作方向:
front:鏈表頭部(第一個節點)。
back:鏈表尾部(最后一個節點)。
push_front():在頭部插入元素。
push_back():在尾部插入元素。
pop_front():刪除頭部元素。
pop_back():刪除尾部元素。
#include <list>
list<int> lst = {20, 30};lst.push_front(10); // 頭部插入 → [10,20,30]
lst.push_back(40); // 尾部插入 → [10,20,30,40]
lst.pop_front(); // 刪除頭部 → [20,30,40]
lst.pop_back(); // 刪除尾部 → [20,30]
/*圖示如下
front → [10] <-> [20] <-> [30] ← back↑ ↑push_front/pop_front push_back/pop_back
*/
堆(Heap)和棧(Stack)的底層實現
2.1 內存中的堆和棧
- 堆(Heap):動態分配的內存區域,由程序員手動管理(new/malloc)。
底層實現:由操作系統內存管理器通過復雜數據結構(如空閑鏈表、內存池)管理,與容器無關。 - 棧(Stack):函數調用時的自動內存區域,存儲局部變量和函數參數。
底層實現:由編譯器通過調整棧指針(SP)直接管理,內存分配高效且嚴格遵循LIFO。
2.2 數據結構中的堆和棧
- 棧(Stack容器):后進先出(LIFO)的容器適配器。
底層實現:默認基于 deque,也可用 vector 或 list。 - 堆(優先隊列,Priority Queue):元素按優先級出隊(通常用堆數據結構實現)。
底層實現:默認基于 vector 的二叉堆(完全二叉樹)。
關鍵結論:
- 堆(內存)和棧(內存) 是操作系統管理的內存區域,不與容器直接關聯。
- 棧容器(LIFO) 默認基于 deque,優先隊列(堆) 默認基于 vector 的二叉堆實現。