C/C++工程師面試題(STL篇)

STL 中有哪些常見的容器

STL 中容器分為順序容器、關聯式容器、容器適配器三種類型,三種類型容器特性分別如下:

1. 順序容器 容器并非排序的,元素的插入位置同元素的值無關,包含 vector、deque、list?

  • vector:動態數組 元素在內存連續存放。隨機存取任何元素都能在常數時間完成。在尾端增刪元素具有較佳的性能。
  • deque:雙向隊列 元素在內存連續存放。隨機存取任何元素都能在常數時間完成(僅次于 vector )。在兩端增刪元素具有較佳的性能(大部分情況下是常數時間)。
  • list:雙向鏈表 元素在內存不連續存放。在任何位置增刪元素都能在常數時間完成。不支持隨機存取。

2. 關聯式容器 元素是排序的;插入任何元素,都按相應的排序規則來確定其位置;在查找時具有非常好的性能;通常以平衡二叉樹的方式實現,包含set、map。

  • set? set中不允許相同元素
  • map map 與 set 的不同在于 map 中存放的元素有且僅有兩個成員變,一個名為 first,另一個名為 second,map 根據 first 值對元素從小到大排序,并可快速地根據 first 來檢索元素。

3. 容器適配器 封裝了一些基本的容器,使之具備了新的函數功能,包含 stack、queue。

  • stack:棧 棧是項的有限序列,并滿足序列中被刪除、檢索和修改的項只能是最進插入序列的項(棧頂的項),后進先出。
  • queue:隊列 插入只可以在尾部進行,刪除、檢索和修改只允許從頭部進行,先進先出。

STL 容器用過哪些,查找的時間復雜度是多少,為什么?

以下是其中一些常見容器的查找時間復雜度以及原因:

  1. vector(向量):查找時間復雜度為O(n),因為vector是基于數組實現的,需要線性遍歷整個數組來查找元素。

  2. deque(雙端隊列):在未排序狀態下,查找時間復雜度為O(n),類似于vector。但在有序狀態下,可以利用二分查找,降低查找時間復雜度為O(log n)。

  3. list(鏈表):查找時間復雜度為O(n),因為鏈表是一種線性結構,需要從頭開始順序查找元素。

  4. set(集合)multiset(多重集合):查找時間復雜度為O(log n),底層通常使用紅黑樹實現,具有較好的平衡性能。

  5. map(映射)multimap(多重映射):查找時間復雜度為O(log n),底層通常使用紅黑樹實現,按鍵進行自動排序。

  6. stack(棧)queue(隊列):查找時間復雜度為O(n),因為它們是容器適配器,提供了先進先出(FIFO)或后進先出(LIFO)的接口,并不支持快速查找操作。

因此,對于不同的STL容器,其查找時間復雜度取決于底層數據結構的實現方式和算法設計。

vector 和 list 的區別,分別適用于什么場景?

vector 和 list 的區別:

  1. 底層數據結構:

    • vector: 底層使用動態數組實現。
    • list: 底層使用雙向鏈表實現。
  2. 插入和刪除操作:

    • vector: 插入和刪除元素效率低。
    • list: 插入和刪除元素效率高,因為只需要修改相鄰節點的指針。
  3. 隨機訪問:

    • vector: 支持隨機訪問,可以通過下標快速訪問元素。
    • list: 不支持隨機訪問,只能通過迭代器順序訪問元素。
  4. 空間和內存分配:

    • vector: vector 一次性分配好內存,不夠時才進行擴容。
    • list: list 每次插入新節點都會進行內存申請。

適用場景:

  • vector: 適用于連續存儲,支持隨機訪問,而不在乎插入和刪除的效率。

  • list: 適用于不連續的內存空間,如果需要高效的插入和刪除,而不關心隨機訪問。

簡述 vector 的實現原理

vector 是一種動態數組,在內存中具有連續的存儲空間,支持快速隨機訪問,由于具有連續的存儲空間,所以在插入和刪除操作方面,效率比較慢。

當 vector 的大小和容量相等(size==capacity)時,如果再向其添加元素,那么 vector 就需要擴容。vector 容器擴容的過程需要經歷以下 3 步:

  1. 重新在堆上創建更大的動態數組,大小是原來的2倍;
  2. 將舊內存空間中的數據,按原有順序移動到新的內存空間中;
  3. 最后將舊的內存空間釋放。

擴容以后它的內存地址會發生改變

迭代器失效原因,有哪些情況

迭代器失效是指迭代器在遍歷容器過程中,由于容器的結構發生改變而導致迭代器指向的元素不再有效。

以下是導致迭代器失效的常見情況:

  1. 插入和刪除操作: 當在容器中插入或刪除元素時,可能會導致容器內存重新分配或元素位置的改變,這可能會使迭代器失效。
  2. 清空容器: 清空容器會使容器內的所有元素被刪除,這樣迭代器指向的元素就會失效。
  3. 使用引起重新分配的操作: 例如,在vector中使用push_back()添加元素時,如果超出了當前容量,可能會觸發重新分配操作,從而使所有迭代器失效。
  4. 排序操作: 如果在排序過程中,容器的元素被移動了位置,迭代器可能會失效。
  5. 使用非常量迭代器遍歷過程中修改了容器: 如果在使用非常量迭代器遍歷容器的過程中,修改了容器的結構(例如插入或刪除元素),會使迭代器失效。

deque 的實現原理

分段連續內存、中控器

deque 是由一段一段的連續空間構成。一旦有必要在 deque 前端或者尾端增加新的空間,便配置一段連續定量的空間,串接在 deque 的頭端或者尾端。

deque 采取一塊所謂的 map(不是 STL 的 map 容器)作為主控,這里所謂的 map 是一小塊連續的內存空間,其中的每個元素(此處成為一個結點)都是一個指針,指向另一段連續性內存空間,稱作緩沖區。緩沖區才是 deque的存儲空間的主體。

紅黑樹的特性,為什么要有紅黑樹

紅黑樹是一種自平衡的二叉搜索樹,它具有以下特性:

  1. 節點顏色: 每個節點要么是紅色,要么是黑色。
  2. 根節點和葉子節點: 根節點、葉子節點(NIL節點,即空節點)是黑色的
  3. 顏色相鄰節點規則: 不能有兩個相鄰的紅色節點。
  4. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。 這保證了紅黑樹的關鍵性質:最長路徑不超過最短路徑的兩倍。

2. 各操作的時間復雜度 插入: O(logN) 查看: O(logN) 刪除: O(logN)

map/Set 實現原理,各操作的時間復雜度是多少

1. map 實現原理 map 內部實現了一個紅黑樹,紅黑樹有自動排序的功能,因此 map 內部所有元素都是有序的,紅黑樹的每一個節點都代表著 map 的一個元素。因此,對于 map 進行的查找、刪除、添加等一系列的操作都相當于是對紅黑樹進行的操作。map 中的元素是按照二叉樹存儲的,特點就是左子樹上所有節點的鍵值都小于根節點的鍵值,右子樹所有節點的鍵值都大于根節點的鍵值,使用中序遍歷可將鍵值按照從小到大遍歷出來。

2. 各操作的時間復雜度 插入: O(logN) 查看: O(logN) 刪除: O(logN)

unordered_map 實現原理

unordered_map 容器和 map 容器一樣,以鍵值對(pair類型)的形式存儲數據,存儲的各個鍵值對的鍵互不相同且不允許被修改。但由于 unordered_map 容器底層采用的是哈希表存儲結構,該結構本身不具有對數據的排序功能,所以此容器內部不會自行對存儲的鍵值對進行排序。底層采用哈希表實現無序容器時,會將所有數據存儲到一整塊連續的內存空間中,并且當數據存儲位置發生沖突時,解決方法選用的是“鏈地址法”(又稱“開鏈法”).

map,unordered_map 的區別

  1. map是基于紅黑樹實現的,unordered_map是基于哈希表實現的
  2. map根據元素的鍵值會自動排序,而unordered_map是亂序的
  3. map的增刪改查時間復雜度是O(logN),而unordered_map的時間復雜度是最好情況是O(1),最壞情況是O(N)。

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

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

相關文章

DocxToDoc.java

DocxToDoc.java word高版本docx轉化word2003版本 package word;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagrap…

【Ubuntu 20.04 / 22.04 LTS】最新 esp-matter SDK 軟件編譯環境搭建步驟

倉庫鏈接:esp-matter SDK官方軟件說明:ESP Matter Programming Guide官方參考文檔:使用 Matter-SDK 快速搭建 Matter 環境 (Linux) 環境要求 Ubuntu 20.04 或 Ubuntu22.04網絡環境支持訪問 Gihub 在安裝 esp-matter SDK 軟件編譯環境之前&a…

三八女神節特別推薦:完美禮物俘獲她的芳心

三八女神節馬上就要到了,這是一個贊頌女性獨立、堅韌與美麗的時刻。在這個充滿溫馨與敬意的日子里,很多人想要為那些綻放光彩的女性們獻上一份特別的禮物。這不僅是一份物質上的饋贈,更是一份心靈上的交流,一次情感上的共鳴。 真…

面試經典150題——簡化路徑

"A goal is a dream with a deadline." - Napoleon Hill 1. 題目描述 2. 題目分析與解析 2.1 思路一 這個題目開始看起來并不太容易知道該怎么寫代碼,所以不知道什么思路那就先模擬人的行為,比如對于如下測試用例: 首先 /代表根…

手把手教會你使用Markdown【從入門到精通一篇就夠了】

手把手教會你使用Markdown【從入門到精通一篇就夠了】 前言一、Markdown是什么二、Markdown優點三、Markdown的基本語法3.1 標題3.2 字體3.3 換行3.4 引用3.5 鏈接3.6 圖片3.7 列表3.8 分割線3.9 刪除線3.10 下劃線3.11 代碼塊3.12 表格3.13 腳注3.14 特殊符號 四、Markdown的高…

UCSF DOCK 分子對接詳細案例(04)-基于RDKit描述符的分子從頭設計DOCK_D3N

歡迎瀏覽我的CSND博客! Blockbuater_drug …點擊進入 文章目錄 前言一、 軟件及操作環境二、研究目的三、結構文件準備四、 DOCK/RDKit中 de novo design4.1 de novo design - refine_D3N4.2 對輸出重新評分 總結參考資料 前言 本文是UCSF DOCK的使用案例分享&…

lv20 QT事件5

1 事件模型 2 事件處理 virtual void keyPressEvent(QKeyEvent *event) virtual void keyReleaseEvent(QKeyEvent *event) virtual void mouseDoubleClickEvent(QMouseEvent *event) virtual void mouseMoveEvent(QMouseEvent *event) virtual void mousePressEvent(QMou…

【短時交通流量預測】基于Elman神經網絡

課題名稱:基于Elman神經網絡的短時交通流量預測 版本時間:2023-04-27 代碼獲取方式:QQ:491052175 或者 私聊博主獲取 模型簡介: 城市交通路網中交通路段上某時刻的交通流量與本路段前幾個時段的交通流量有關&#…

自己拍攝的視頻能做成二維碼嗎?快速在線生碼該怎么操作?

自己拍攝的視頻能做成二維碼嗎?現在掃描二維碼用來播放視頻的使用場景越來越多,這種方式的流行在于能夠通過更低的成本獲取更好的效果,有效的提升用戶獲取視頻內容的體驗,通過消耗流量就可以播放視頻。 那么視頻制作二維碼一般會…

vue2 vue-router源碼解析

目錄 Vue Router 的基本結構和功能 源碼分析 一. 編寫install 方法 二 .生命變量存儲路由信息和當前路由 三 .初始化路由 把路由信息記錄在routeMap中 四.注冊router-link 和router-view 組件 Vue Router 的基本結構和功能 路由器實例(Router 實例)…

Vue.js 修飾符:精準控制組件行為

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 🍚 藍橋云課簽約作者、上架課程《Vue.js 和 E…

多點通信與域套接字:2024/3/4

作業1&#xff1a;廣播 發送端&#xff1a; #include <myhead.h> int main(int argc, const char *argv[]) {//1.創建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}printf("sfd%d\n",sfd);//2.設置當前…

藍橋杯復習之前綴和

題目鏈接&#xff1a;https://www.luogu.com.cn/problem/P8649 思路&#xff1a; 看到區間和&#xff0c;第一反應肯定是前綴和&#xff0c;我們求出前綴和后對前綴和數組每一個值模k&#xff0c;然后對一個數組的值查看前面有幾個相同的&#xff0c;舉個例子&#xff1a;…

【python 常見錯誤】

標題【python 常見錯誤】 一、python 常見錯誤 Python編程過程中&#xff0c;開發者可能會遇到多種類型的錯誤。這些錯誤大致可以分為三類&#xff1a;語法錯誤&#xff08;SyntaxError&#xff09;、邏輯錯誤和運行時錯誤。下面將詳細介紹這幾種錯誤類型&#xff0c;并提供相…

【動態規劃】第十一屆藍橋杯省賽第二場C++ C組《數字三角形》(c++)

1.題目描述 上圖給出了一個數字三角形。 從三角形的頂部到底部有很多條不同的路徑。 對于每條路徑&#xff0c;把路徑上面的數加起來可以得到一個和&#xff0c;你的任務就是找到最大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數。 …

Pytorch學習 day03(Tensorboard)

Tensorboard Tensorboard能夠可視化loss的變化過程&#xff0c;便于我們查看模型的訓練狀態&#xff0c;也能查看模型當前的輸入和輸出結果 在Pycharm中&#xff0c;可以通過按住ctrl&#xff0c;并左鍵點擊某個庫來進入源文件查看該庫的使用方法 SummaryWriter是用來向log_di…

3分鐘,學會一個測試員必懂 Lambda 小知識!

今天再來給大家介紹下函數式接口和方法引用。 函數式接口 問&#xff1a;Lambda 表達式的類型是什么&#xff1f; 答&#xff1a;函數式接口 問&#xff1a;函數式接口是什么&#xff1f; 答&#xff1a;只包含一個抽象方法的接口&#xff0c;稱為函數式接口 &#xff08;…

Linux服務器磁盤及內存用量監控Python腳本(推送釘釘群通知)

文章目錄 Python 腳本釘釘推送通知定時任務 Python 腳本 # -*- coding: utf-8 -*- import subprocessdef get_disk_usage():# 執行 df 命令獲取磁盤使用情況df_process subprocess.Popen([df, -h, /], stdoutsubprocess.PIPE)output, _ df_process.communicate()output out…

Lua 篇(一)— 安裝運行Hello World

目錄 前言一、Lua 是什么&#xff1f;二、Lua和C#的區別三、安裝 LuaLinux 系統上安裝Mac OS X 系統上安裝Window 系統上安裝emmyluaRider 安裝(推薦) 四、Lua學習資料 前言 Lua 是一種輕量級的嵌入式腳本語言&#xff0c;它可以與 C 語言無縫集成&#xff0c;提供了強大的編程…

YOLOv6-Openvino和ONNXRuntime推理【CPU】

1 環境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安裝Openvino和ONNXRuntime 2.1 Openvino簡介 Openvino是由Intel開發的專門用于優化和部署人工智能推理的半開源的工具包&#xff0c;主要用于對深度推理做優化。 Openvino內部集成了Opencv、Tens…