[C++面試] 關于deque

一、入門

1、deque與vector的區別

deque的迭代器包含以下信息:

  • 當前緩沖區指針(current_buffer
  • 當前元素在緩沖區內的位置(current
  • 中控器的位置(map
    每次移動迭代器時,需檢查是否跨越緩沖區邊界,必要時跳轉到下一個緩沖區

deque(雙端隊列)是C++標準庫中的序列容器,支持在頭部和尾部高效插入/刪除元素,同時允許隨機訪問。
vector的主要區別:

  • ?存儲結構vector使用連續內存塊,而deque由多個分段緩沖區組成,邏輯連續但物理非連續
  • ?操作效率deque在頭部插入/刪除時間復雜度為O(1),而vector頭部操作需移動所有元素,效率為O(n)
  • ?內存擴展vector擴容時需整體復制,deque僅需新增緩沖區

2、如何初始化一個deque?(int 類型為例)

deque<int> d1;                   // 默認構造
deque<int> d2(10, 5);           // 10個元素,每個為5
deque<int> d3(d2.begin(), d2.end()); // 范圍復制
deque<int> d4(d3);              // 拷貝構造

3、deque常用成員函數有哪些?

  • push_front()/push_back():頭尾插入
  • pop_front()/pop_back():頭尾刪除
  • operator[]at():隨機訪問
  • size()/empty():容量查詢

4、deque允許隨機訪問是怎么做到的?性能怎么樣?

效率略低于vector
?原因deque的隨機訪問需通過中控器定位到具體緩沖區,再計算元素在緩沖區內的偏移,多了一層間接尋址;而vector直接通過連續內存的基地址+偏移量訪問,無需額外查找步驟。

a、?確定目標緩沖區:假設每個緩沖區存儲block_size個元素,則目標緩沖區在中控器中的索引為:

buffer_index = (n / block_size) + start_buffer_index;

b、確定元素在緩沖區內的偏移

element_offset = n % block_size;

c、??訪問元素

value = *(中控器[buffer_index] + element_offset);

二、進階

1、解釋deque的底層實現原理(中控器的作用)

deque底層由多個固定大小的緩沖區組成,通過“中控器”(通常是一個指針數組)管理這些緩沖區的地址。

  • 中控器維護各緩沖區的起始地址,使得邏輯上呈現連續空間。
  • 插入元素時,若當前緩沖區已滿,則分配新緩沖區并更新中控器,避免整體擴容

2、在中間位置插入元素時,dequelist的性能差異如何?為什么?

  • list在已知迭代器位置時,中間插入/刪除時間復雜度為O(1),僅需調整指針。
  • deque的中間插入/刪除需移動元素,時間復雜度為O(n)
    ?原因deque需保持邏輯連續性,插入點后的元素需整體移動;而list作為雙向鏈表無需移動數據

3、deque的迭代器失效場景有哪些?與vector有何不同?

在中間插入/刪除元素:可能導致后續元素的迭代器失效(需移動元素)。vector在插入/刪除元素時,所有后續迭代器均失效;而deque僅在涉及緩沖區重新分配時影響部分迭代器。

vector的所有元素存儲在單個連續內存塊中。當插入/刪除元素時:

  • ?插入導致擴容:會分配更大的內存塊,將舊元素整體復制到新內存,此時所有迭代器(包括首尾指針)均失效。
  • ?刪除或中間插入:后續元素需要向前或向后移動,所有指向移動元素的迭代器(包括之后的迭代器)均失效

deque由多個固定大小的緩沖區組成,通過中控器(指針數組)管理。插入/刪除時:

  • ?頭尾插入不觸發緩沖區擴容:僅修改中控器的頭尾指針,其他迭代器仍有效。
  • ?頭尾插入觸發緩沖區擴容:中控器可能需要擴展(例如中控器的指針數組已滿),此時所有迭代器可能失效(但實際實現會盡量避免)。
  • ?中間插入/刪除:需移動元素,導致部分迭代器失效,但其他緩沖區的迭代器仍有效。

三、高階

1、在實際開發中,deque適合哪些應用場景?舉例說明

  • 雙端操作頻繁的場景:如實現滑動窗口算法、任務調度隊列
  • ?需要隨機訪問的隊列:例如需要快速訪問歷史記錄的撤銷/重做功能(結合push_front和隨機訪問)
  • ?替代vector的中間插入場景:若僅在兩端操作,deque性能優于vector,且避免內存頻繁重分配

2、為何deque在STL的stackqueue中作為默認底層容器?

  • 內存效率deque的內存利用率高于list(無節點指針開銷)
  • ?性能平衡stackqueue僅需操作一端或兩端,deque的O(1)頭尾操作和連續內存訪問特性更合適
  • ?歷史原因vector曾作為stack默認容器,但deque的頭部擴展能力更靈活

3、?多線程環境下使用deque需要注意什么?

  • ?線程安全性:C++標準庫容器本身不保證線程安全,需外部同步(如互斥鎖)。
  • ?操作原子性:例如push_back()pop_front()需加鎖,避免競爭條件

4、如何優化deque的性能?是否支持自定義內存分配器?

  • 預分配緩沖區(如通過構造函數指定初始大小)。
  • 避免頻繁的中間插入/刪除操作。
  • ?自定義內存分配器:支持。可通過模板參數替換默認分配器,優化內存管理策略

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

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

相關文章

服務性能防腐體系:基于自動化壓測的熔斷機制

01# 背景 在系統架構的演進過程中&#xff0c;項目初始階段都會通過壓力測試構建安全護城河&#xff0c;此時的服務性能與資源水位保持著黃金比例關系。然而在業務高速發展時期&#xff0c;每個沖刺周期都被切割成以業務需求為單位的開發單元&#xff0c;壓力測試逐漸從必選項…

SpringBoot 和vue前后端配合開發網頁拼圖10關游戲源碼技術分享

今天分享一個 前后端結合 的網頁游戲 開發項目源碼技術。 這也是我第一次寫游戲類的程序&#xff0c;雖然不是特別復雜的游戲&#xff0c;但是是第一次寫&#xff0c;肯定要記錄一下了&#xff0c;哈哈。 游戲的內容 就是 我們顯示中玩的那個 拼圖碎片的 游戲&#xff0c;類似下…

【k8s002】k8s健康檢查與故障診斷

k8s健康檢查與故障診斷 ?一、集群狀態檢查? ?檢查節點健康狀態? kubectl get nodes -o wide # 查看節點狀態及基本信息 kubectl describe node <node-name> # 分析節點詳細事件&#xff08;如資源不足、網絡異常&#xff09; kubectl top nodes …

01-Canvas-使用fabric初始

fabric官網&#xff1a; https://fabric5.fabricjs.com/demos/ 創建畫布并繪制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

【機器學習-基礎知識】統計和貝葉斯推斷

1. 概率論基本概念回顧 1. 概率分布 定義: 概率分布(Probability Distribution)指的是隨機變量所有可能取值及其對應概率的集合。它描述了一個隨機變量可能取的所有值以及每個值被取到的概率。 對于離散型隨機變量,使用概率質量函數來描述。對于連續型隨機變量,使用概率…

常見限流算法及實現

1. 固定窗口計數器&#xff08;Fixed Window Counter&#xff09; 原理&#xff1a;在固定時間窗口&#xff08;如1分鐘&#xff09;內統計請求數&#xff0c;超過閾值則拒絕后續請求。優點&#xff1a;實現簡單&#xff0c;內存占用低。缺點&#xff1a;存在窗口切換時的流量…

《TCP/IP網絡編程》學習筆記 | Chapter 18:多線程服務器端的實現

《TCP/IP網絡編程》學習筆記 | Chapter 18&#xff1a;多線程服務器端的實現 《TCP/IP網絡編程》學習筆記 | Chapter 18&#xff1a;多線程服務器端的實現線程的概念引入線程的背景線程與進程的區別 線程創建與運行pthread_createpthread_join可在臨界區內調用的函數工作&#…

創新實踐分享:基于邊緣智能+扣子的智能取物機器人解決方案

在 2024 年全國大學生物聯網設計競賽中&#xff0c;火山引擎作為支持企業&#xff0c;不僅參與了賽道的命題設計&#xff0c;還為參賽隊伍提供了相關的硬件和軟件支持。以邊緣智能和扣子的聯合應用為核心&#xff0c;參賽者們在這場競賽中展現出了卓越的創新性和實用性&#xf…

QT:動態屬性和對象樹

動態對象 1.添加Q_PROPERTY對象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…

MobileNet家族:從v1到v4的架構演進與發展歷程

MobileNet 是一個專為移動設備和嵌入式系統設計的輕量化卷積神經網絡&#xff08;CNN&#xff09;家族&#xff0c;旨在在資源受限的環境中實現高效的圖像分類、對象檢測和語義分割等任務。自 2017 年首次推出以來&#xff0c;MobileNet 經歷了從 v1 到 v4 的多次迭代&#xff…

在 Windows 上使用 choco 安裝 mkcert 并配置 Vue 運行HTTPS

解決在Windows上使用Vue本地運行HTTPS的問題,vue-cli或vite都可以使用 步驟 1&#xff1a;確認 Chocolatey 是否已安裝 1. 檢查 choco 命令是否可用 打開 PowerShell&#xff08;管理員權限&#xff09;&#xff0c;輸入&#xff1a; choco -v如果顯示版本號&#xff08;如…

【PHP】新版本特性記錄(持續更新)

文章目錄 前言PHP 7.01&#xff09;NULL合并運算符&#xff1a;??2&#xff09;參數、返回值支持類型聲明3&#xff09;太空船操作符&#xff1a;<>4&#xff09;通過 define 定義常量數組5&#xff09;匿名類實例化6&#xff09;字符串里使用\u轉義unicode codepoint …

【記】如何理解kotlin中的委托屬性?

1. 什么是委托屬性&#xff1f; 委托屬性的核心思想是&#xff1a; 你可以將一個屬性的 getter 和 setter 的邏輯交給一個外部對象&#xff08;稱為委托對象&#xff09;來處理。這個外部對象負責存儲屬性的值&#xff0c;并提供自定義的 get 和 set 行為。 通過委托屬性&am…

使用自動導入后,eslint報錯 eslint9

前提&#xff1a;使用pnpm create vuelatest創建vue應用&#xff0c;并且在創建項目時就勾選eslint和prettier&#xff0c;不然有些配置還需要手動配&#xff0c;比如解決eslint和prettier的沖突問題 1. 解決使用自動導入后Eslint報錯問題 配置vite.config.ts // 自動導入api…

springboot EasyExcel 實現導入導出

1. 添加依賴 確保 Maven 依賴中包含 EasyExcel 3.0.5&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dep…

實現懸浮按鈕拖動,兼容h5和微信小程序

h5用js寫&#xff0c;微信小程序用 代碼里面沒有完全實現吸附邊緣的功能&#xff0c;需要吸附邊緣的話還得自己再完善下&#xff08;h5的吸附邊緣是可以的&#xff0c;小程序的還有點問題&#xff09; 主要功能是&#xff1a;圖片上寫文字的懸浮按鈕&#xff0c;文字使用的是…

2、操作系統之軟件基礎

一、硬件支持系統 &#xff0c;系統管理硬件 操作系統核心功能可以分為&#xff1a; 守護者&#xff1a;對硬件和軟件資源的管理協調者&#xff1a;通過機制&#xff0c;將各種各樣的硬件資源適配給軟件使用。 所以為了更好的管理硬件&#xff0c;操作系統引進了軟件。其中3大…

17 | 實現簡潔架構的 Biz 層

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

idea更新git代碼報錯No Git Roots

idea更新git代碼報錯&#xff1a; No Git Roots None of configured Git roots are under Git. The configured directory must have ".git directory in it.但是本地項目里是存在.git文件的&#xff0c;就是突然間不能更新代碼了 然后嘗試重新拉新項目代碼提示: Git i…

Webpack 知識點整理

? 1. 對 webpack 的理解&#xff1f;解決了什么問題&#xff1f; Webpack 是前端工程化領域的核心工具&#xff0c;其核心定位是模塊打包器&#xff08;Module Bundler&#xff09;&#xff0c;通過將各類資源&#xff08;JS、CSS、圖片等&#xff09;視為模塊并進行智能整合…