3.3 序列式容器-deque、stack、queue、heap、priority_queue

deque

3.1定義

std::deque(雙端隊列)是C++標準模板庫(STL)中的一種容器,表示雙端隊列數據結構。它提供了在兩端高效地進行插入和刪除操作的能力。與vector的連續線性空間類似,但有所不同,deque動態地以分段連續空間組合而成的,隨時可以增加一段新的空間并鏈接起來。因此deque的迭代器并不是普通的指針;

之前提到vector的動態內存增長需要涉及到更大內存的分配;內存數據的復制;原內存空間的釋放。deque避開了vector中的反復內存搬移,但是數據結構的設計和迭代器架構卻異常復雜。deque的代碼實現量遠比vector和list多得多。

3.2deque中控器

deque微觀上看起來是連續空間,但宏觀上看,deque內部并沒有完全在一塊連續空間,而是由一段一段的連續空間構成。而這一段一段的連續空間的管理就需要一個中控器。deque采用一塊連續的“map”映射區(并不是STL中的map)來管理這些空間。其中每個元素(即一個節點)都是指針,指向一塊較大的連續的線性空間,這一塊較大的連續線性空間才是deque儲存空間的主體。

在這里插入圖片描述
map其實是一個二級指針,T**,它是一個指針,所指之物又是一個指針,指向一塊型別為T的空間。

3.3迭代器

deque迭代器屬于最高級的隨機訪問迭代器,但是相對于vector的普通指針迭代器,deque的迭代器實現相當復雜。

deque迭代器結構:

struct _deque_iterator
{typedef __deque_iterator<T,T&,T*,BufSize> iterator;static size_t buffer_size(){return __deque_buf_size(BufSize,sizeof(T));}//保持與容器的聯結//此迭代器所指緩沖區中的當前行(current)元素T* cur;//緩沖區的頭部元素T* first;//緩沖區的尾部元素T* last;//緩沖區管理中心map_pointer node;
};

在這里插入圖片描述
deque迭代器的關鍵成員函數:
在這里插入圖片描述
迭代器的++,—重載都要考慮臨界的情況。
在這里插入圖片描述

在這里插入圖片描述

3.4數據結構

deque除了維護一個指向map的指針外,也維護兩個迭代器,start和finish,分別指向第一個緩沖區的第一個元素和最后一個緩沖區的最后一個元素(的下一個位置)。此外還有map的大小,當map用完之后,還需要重新配置一塊更大的map。

deque數據結構代碼:

template <class T,class Alloc=alloc,size_t BufSiz=0>
class deque
{
public:typedef T value_type;typedef value_type* pointer;typedef size_t size_type;...
protected://元素的指針的指針typedef pointer* map_pointer;//第一個節點iterator start;//最后一個節點iterator finish;//指向是連續空間map_pointer map;//map內指針數量size_type map_size;
}

deque的map節點的分配會以最中間開始,保證前后兩端指向可擴充的空間大小相同。
在這里插入圖片描述
在這里插入圖片描述

stack

stack基于LIFO(Last-In, First-Out)原則,允許在容器的末尾添加元素,并從末尾移除元素。stack其實是一個容器適配器,它是基于其他底層容器實現的。可以是 std::deque, std::liststd::vector。默認情況下,std::deque 被用作 std::stack 的底層容器。

stack沒有迭代器,所有元素都是先進后出的規則。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
可以看到用組合的形式,使用底層容器queue的功能。

queue

std::queue 是基于FIFO(First-In, First-Out)原則的容器,允許在容器的末尾添加元素,并在容器的前端移除元素。,queue是一個適配器容器,基于底層的容器實現。并且默認情況下,std::deque 被用作 std::queue 的底層容器。std::queue 提供了隊列的基本操作,例如 pushpopfront,分別用于在隊尾添加元素、移除隊首元素和獲取隊首元素的值。

在這里插入圖片描述
queue沒有迭代器。
在這里插入圖片描述

heap

heap又叫做堆,不屬于STL的容器組件,只是優先隊列中會用到。

可以了解一下堆的排序算法:

在這里插入圖片描述

建堆的時間復雜度為:o(n)

時間復雜度 : o(nlogn)

下標為i的節點的父節點下表:(i-1)/2

下標為i的節點的左孩子下表:i*2+1

下標為i的節點的右孩子下表:i*2+2

void sortSolution::maxHeap(vector<int>& arr, int i, int heapSize) {int l = i * 2 + 1;int r = l + 1;int largest = i;if(l < heapSize && arr[l] > arr[largest]) {largest = l;}if(r < heapSize && arr[r] > arr[largest]) {largest = r;}if(largest != i) {swap(arr[i], arr[largest]);maxHeap(arr, largest, heapSize);}
}
void sortSolution::buildMaxHeap(vector<int>& arr) {for(int i = arr.size() / 2 - 1; i >= 0; --i) {maxHeap(arr, i, arr.size()); }
}
void sortSolution::heapSort(vector<int>& arr) {buildMaxHeap(arr);for(int i = arr.size() - 1; i > 0; --i) {swap(arr[0], arr[i]);maxHeap(arr, 0, i);}
}

priority_queue

priority_queue是一個具有權值觀念的queue,它允許加入新元素、移除舊元素、審視元素值等功能。其內部的函數是按照權值進行排序的。也屬于容器適配器。

默認情況下,std::priority_queue 是一個最大堆(Max Heap),即根節點的值大于或等于其子節點的值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于ssm旅社客房收費管理系統+vue

目 錄 目 錄 I 摘 要 III ABSTRACT IV 1 緒論 1 1.1 課題背景 1 1.2 研究現狀 1 1.3 研究內容 2 2 系統開發環境 3 2.1 vue技術 3 2.2 JAVA技術 3 2.3 MYSQL數據庫 3 2.4 B/S結構 4 2.5 SSM框架技術 4 3 系統分析 5 3.1 可行性分析 5 3.1.1 技術可行性 5 3.1.2 操作可行性 5 3…

STM32使用FlyMcu串口下載程序與STLink Utility下載程序

文章目錄 前言軟件鏈接一、FlyMcu串口下載程序原理優化手動修改跳線帽選項字節其他功能 二、STLink Utility下載程序下載程序選項字節固件更新 前言 本文主要講解使用FlyMcu配合USART串口為STM32下載程序、使用STLink Utility配合STLink為STM32下載程序&#xff0c;以及這兩個…

代碼隨想錄算法訓練營第62/63天| 503.下一個更大元素II、42. 接雨水、84.柱狀圖中最大的矩形

文章目錄 503.下一個更大元素II思路代碼 42. 接雨水思路代碼 84.柱狀圖中最大的矩形思路代碼 503.下一個更大元素II 題目鏈接&#xff1a;503.下一個更大元素II 文章講解&#xff1a;代碼隨想錄|503.下一個更大元素II 思路 和739. 每日溫度 (opens new window)也幾乎如出一轍&…

C++/數據結構:AVL樹

目錄 一、AVL樹的概念 二、AVL樹的實現 2.1節點定義 2.2節點插入 三、AVL樹的旋轉 3.1新節點插入較高左子樹的左側&#xff1a;右單旋 3.2新節點插入較高右子樹的右側&#xff1a;左單旋 3.3新節點插入較高左子樹的右側---左右&#xff1a;先左單旋再右單旋 3.4新節點插…

Rocky Linux 運維工具 Systemd

一、Systemd 的簡介 Systemd是一個用于管理Linux系統啟動進程和服務的系統和服務管理器&#xff0c;取代了傳統的init系統。它提供了并行啟動、依賴關系管理、動態加載服務文件等功能&#xff0c;成為現代Linux發行版中主流的初始化系統。 二、Systemd 的參數說明 [Unit] Des…

SLAM基礎知識-卡爾曼濾波

前言&#xff1a; 在SLAM系統中&#xff0c;后端優化部分有兩大流派。一派是基于馬爾科夫性假設的濾波器方法&#xff0c;認為當前時刻的狀態只與上一時刻的狀態有關。另一派是非線性優化方法&#xff0c;認為當前時刻狀態應該結合之前所有時刻的狀態一起考慮。 卡爾曼濾波是…

SD NAND:為車載顯示器注入智能與安全的心臟

SD NAND 在車載顯示器的應用 在車載顯示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多種應用&#xff0c;其中一些可能包括&#xff1a; 導航數據存儲&#xff1a; SD NAND 可以用于存儲地圖數據、導航軟件以及車載系統的相關信息。這有助于提…

微服務day03-Nacos配置管理與Nacos集群搭建

一.Nacos配置管理 Nacos不僅可以作為注冊中心&#xff0c;可以進行配置管理 1.1 統一配置管理 統一配置管理可以實現配置的熱更新&#xff08;即不用重啟當服務發生變更時也可以直接更新&#xff09; dataId格式&#xff1a;服務名-環境名.yaml&#xff0c;分組一般使用默認…

InnoDB高級特性篇(5)-使用InnoDB的全文索引

InnoDB是MySQL數據庫的一個關系型存儲引擎。它提供了很多強大的功能&#xff0c;其中一個重要的功能是全文索引。全文索引允許我們在文本數據中進行高效的搜索&#xff0c;以找到包含特定關鍵詞的記錄。在本文中&#xff0c;我們將詳細介紹如何在InnoDB中使用全文索引。 首先&…

藍橋杯備戰刷題two(自用)

1.楊輝三角形 #include<iostream> using namespace std; #define ll long long const int N2e510; int a[N]; //1 0 0 0 0 0 0 //1 1 0 0 0 0 0 //1 2 1 0 0 0 0 //1 3 3 1 0 0 0 //1 4 6 4 1 0 0 //1 5 10 10 5 1 //前綴和思想 //第一列全為1,第二列為從0開始遞增1的序…

信息檢索(七):Transformer Memory as a Differentiable Search Index

Transformer Memory as a Differentiable Search Index 摘要1. 引言2. 相關工作3. 可微搜索索引3.1 索引策略3.1.1 索引方法3.1.2 文檔表示策略 3.2 用于檢索的 Docids 表示3.3 訓練和優化 4. 實驗4.1 基線4.2 實驗結果 5. 結論參考資料 原文鏈接&#xff1a;https://proceedin…

Revit-二開之創建線性尺寸標注-(5)

創建線性尺寸標注 對應的Revit界面的按鈕 線性尺寸標注源碼 本篇文章實現的邏輯是從rvt文章中拾取一面墻,然后對墻添加再水平方向上的線性尺寸標注 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements

LeetCode 刷題 [C++] 第55題.跳躍游戲

題目描述 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 題目分析 題目中…

2.1 mov、add和sub加減指令實操體驗

匯編語言 1. mov操作 1.1 mov移動值 mov指令把右邊的值移動到左邊 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移動寄存器的值 把右邊寄存器的值賦值給左邊的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位&#xff08;high&#xff09;和低八位&am…

設計模式——中介者模式(mediator pattern)

概述 如果在一個系統中對象之間的聯系呈現為網狀結構&#xff0c;如下圖所示。對象之間存在大量的多對多聯系&#xff0c;將導致系統非常復雜&#xff0c;這些對象既會影響別的對象&#xff0c;也會被別的對象所影響&#xff0c;這些對象稱為同事對象&#xff0c;它們之間通過彼…

json---->如何把對象以json的形式傳遞給后端?

把對象以json的形式傳遞有很多種&#xff0c;先寫一種&#xff0c;后期再補充 &#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&…

?用細節去解釋,如何打造一款行政旗艦車型

高山行政加長版應該是這個級別里最大的幾款 MPV 之一了&#xff0c;對于一款較大的車型&#xff0c;其最重要的是解決行駛的便利性。 這次我們就試試魏牌高山行政加長版&#xff0c;從產品本身出發看幾個緯度的細節&#xff1a; 行政該如何定義加長后產品的功能變化加長之后到…

Ladder類創建梯形對象共享一個下底

package Absent;public class Chapter5 {public static void main(String[] args) {Ladder.bottom100;Ladder ladderOnenew Ladder();Ladder ladderTwonew Ladder();ladderOne.top23;ladderTwo.top34;System.out.println("ladderOne的上底&#xff1a;"ladderOne.get…

代碼隨想錄算法訓練營(動態規劃9)|198.打家劫舍 213.打家劫舍II 337.打家劫舍III

今天就是打家劫舍的一天,微笑 198.打家劫舍 leetcode題目鏈接 視頻講解 文章講解 動規五部曲分析如下&#xff1a; 確定dp數組&#xff08;dp table&#xff09;以及下標的含義 dp[i]&#xff1a;考慮下標i&#xff08;包括i&#xff09;以內的房屋&#xff0c;最多可以偷竊…

Java 數組(詳細)

目錄 一、數組的概述 1. 數組的理解&#xff1a; 2. 數組相關的概念&#xff1a; 3. 數組的特點&#xff1a; 4. 數組的分類&#xff1a; 5.數據結構&#xff1a; 二、一維數組 1. 一維數組的聲明與初始化 2. 一維數組元素的引用&#xff1a; 3. 數組的屬性&#xff1…