C++面試八股文:std::deque用過嗎?

来源:https://www.cnblogs.com/binarch/archive/2023/06/26/17507340.html
-Advertisement-
Play Games

某日二師兄參加XXX科技公司的C++工程師開發崗位第26面: > 面試官:`deque`用過嗎? > > 二師兄:說實話,很少用,基本沒用過。 > > 面試官:為什麼? > > 二師兄:因為使用它的場景很少,大部分需要性能、且需要自動擴容的時候使用`vector`,需要隨機插入和刪除的時候可以使用` ...


某日二師兄參加XXX科技公司的C++工程師開發崗位第26面:

面試官:deque用過嗎?

二師兄:說實話,很少用,基本沒用過。

面試官:為什麼?

二師兄:因為使用它的場景很少,大部分需要性能、且需要自動擴容的時候使用vector,需要隨機插入和刪除的時候可以使用list

面試官:那你知道STL中的stack是如何實現的嗎?

二師兄:預設情況下,stack使用deque作為其底層容器,但也可以使用vectorlist作為底層容器。

面試官:你覺得為什麼STL中預設使用deque作為stack的底層容器嗎?

二師兄:額。。(stack也不需要雙端插入啊,不應該vector更好嗎。。)不是很清楚。。

面試官:沒關係。那你知道deque是如何實現的嗎?

二師兄:與vector記憶體空間連續不同,deque是部分連續的。deque通常維護了一個map(不是std::map),map的每個元素指向一個固定大小的chunk。同時維護了兩個指針,指向頭chunk和尾chunk。在deque的頭部或尾部插入元素時,deque會找到頭部或尾部的指針,並通過指針找到對應的chunk。如果chunk中還有未被元素填充的位置,則將元素填充到數組中,如果此指針指向的chunk已經被元素填滿,則需要重新開闢一塊固定大小的chunk,並將chunk記錄在map中。

file

面試官:deque的查找、插入、刪除的時間複雜度是什麼?

二師兄:dqueue查找的時間複雜度是O(N),插入要分情況,如果是頭插和尾插,時間複雜度為O(1),如果是中間插入,則是O(N)。刪除元素和插入元素的時間複雜度相同。

面試官:好的。面試結束,回去等通知吧。

讓我們來看一下二師兄的表現:

為什麼STL中預設使用deque作為stack的底層容器嗎?

STL預設選擇deque最為stack的底層容器肯定是有原因的。vectorlist同樣可以作為deque的底層容器,讓我們比較一下三個容器的差異:(只考慮頭插和尾插,因為stack不需要隨機插入)

deque vector list
插入 O(1) O(1) O(1)
刪除 O(1) O(1) O(1)

從上表中看到,三種容器的插入和是刪除的時間複雜度相同。

但是如果連續插入時,情況發生變化。vectorcapacity被耗盡,元素髮生搬移。

list倒沒有這個顧慮,但是當元素尺寸很小時,list的空間利用率太低。

deque雖然遍歷效率不如vector、隨機插入效率不然list,但stack並不需要這兩種操作,所以dequestack底層容器的最佳選擇。

今天的面試分享到這裡就結束了,讓我們繼續期待二師兄的表現吧。

關註我,帶你21天“精通”C++!(狗頭)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:export declare const X: Y語法用於在Angular應用程式中聲明一個具有指定類型的常量變數,並將其導出,以便在其他文件中使用。 本文分享自華為雲社區《關於 Angular 應用里的 export declare const X Y 的用法》,作者:Jerry Wang。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前段時間在看面經的時候,發現很多份面經中都被問到了 強緩存 和 協商緩存。因此我覺得有必要寫一篇文章來好好聊聊這兩者。 強緩存和協商緩存 瀏覽器緩存是瀏覽器在本地磁碟對用戶最近請求過的文檔進行存儲,當訪問者再次訪問同一頁面時,瀏覽器就可以 ...
  • 跨架構平臺試圖解決這個問題,通過提供一個抽象層,將底層架構與應用程式分離開來,從而使得應用程式可以在多種不同的架構上運行。跨架構平臺通常包括以下三個組件 ...
  • # 前言 本文主要講述**適配器模式**,文中使用通俗易懂的案例,使你更好的學習本章知識點並理解原理,做到有道無術。 # 一.什麼是適配器模式 適配器模式是23種設計模式中**結構型模式**的一種,將一個類的介面轉換成客戶希望的另外一個介面。適配器模式使得原本由於介面不相容而不能一起工作的那些類可以 ...
  • 時間過的很快,3 年的疫情就這麼過去了,留下的卻是緊張的社會氛圍。 目前已經在電腦行業 7 年了,記得那是 2015 年,當時我也才 15 歲,正在讀初二。那會特別喜歡別人的網站,比如卡盟,還有代掛等等別人的那些網站,然後我入坑了。我那會百度怎麼做一個網站,然後搜出來需要學習 html,那時候,我 ...
  • ## SSL 簡介 SSL(Secure Socket Layer,安全套接字層)是一種保證網路上的兩個節點進行安全通信的協議。IETF(Interet Engineering Task Force)國際組織對 SSL 作了標準化,制定了 RFC2246 規範,並將其稱為傳輸層安全(Transpor ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • ### 序 前面介紹了k8s組件和對象的一些基本概念,瞭解了k8s具體是做什麼的以及架構,那麼接下來我們開始介紹怎麼去安裝k8s,這裡我們以windows為例,其他平臺可以參考Kubernetes官方文檔,其實安裝方式都是類似的。 ### 先決條件 要在系統中安裝 Kubernetes,以下是一些需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...