C++面試八股文:std::vector瞭解嗎?

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

某日二師兄參加XXX科技公司的C++工程師開發崗位第23面: > 面試官:`vector`瞭解嗎? > > 二師兄:嗯,用過。 > > 面試官:那你知道`vector`底層是如何實現的嗎? > > 二師兄:`vector`底層使用動態數組來存儲元素對象,同時使用`size`和`capacity`記錄 ...


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

面試官:vector瞭解嗎?

二師兄:嗯,用過。

面試官:那你知道vector底層是如何實現的嗎?

二師兄:vector底層使用動態數組來存儲元素對象,同時使用sizecapacity記錄當前元素的數量和當前動態數組的容量。如果持續的push_back(emplace_back)元素,當size大於capacity時,需要開闢一塊更大的動態數組,並把舊動態數組上的元素搬移到當前動態數組,然後銷毀舊的動態數組。

面試官:你知道新開闢的動態數組的容量是就數組的多少倍比較合適?

二師兄:這個值在不同的編譯器上不是固定的。MSVC 是1.5,而GCC是2。

面試官:有沒有什麼好的辦法提升vector連續插入效率?

二師兄:有的,如果知道數據的大概量,我們可以使用reserve方法直接為vector擴容這個量級。這樣在後續的數據插入時就不會因為頻繁的capacity被用盡而導致的多次的數據搬移,從而提升vector插入效率。

面試官:push_backemplace_back有什麼區別?

二師兄:兩者都可以在容器尾部插入元素。在GCC中,如果插入的元素是右值,兩者都會move元素到容器。如果是左值,兩者都會copy元素到容器。唯一不同的一點是,當C++版本高於C++17時,emplace_back返回當前插入的值的引用,而push_back返回void

面試官:eraseremove有什麼區別?

二師兄:erase屬於成員函數,erase刪除了元素,remove屬於演算法庫函數,而remove只會把元素移動到尾部。

面試官:哪些情況下迭代器會失效?

二師兄:迭代器失效主要有兩種情況引起:1.插入數據。由於插入數據可能導致數據搬移(size > capacity),所以迭代器失效。2.刪除數據。當使用erase刪除數據時,被刪除數據後面的數據依次向前移一位。這會導致被刪除數據之後的迭代器失效。

面試官:如何快速的清空vector容器並釋放vector容器所占用的記憶體?

二師兄:有兩種方法:第一種,使用clear方法清空所有元素。然後使用shrink_to_fit方法把capacitysize(0)對齊,達到釋放記憶體的作用:

#include <iostream>
#include <vector>
int main(int argc, char const *argv[])
{
    std::vector<int> vi;
    vi.reserve(1024);
    for (int i = 0; i < 1024; i++) vi.push_back(i);
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //1024 1024
    vi.clear(); 
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 1024
    vi.shrink_to_fit(); 
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 0
}

二師兄:第二種,使用swap方法;

#include <iostream>
#include <vector>
int main(int argc, char const *argv[])
{
    std::vector<int> vi;
    vi.reserve(1024);
    for (int i = 0; i < 1024; i++) vi.push_back(i);
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //1024 1024
    std::vector<int>().swap(vi); //使用臨時量(size =0, capacity=0)和vi交換,臨時量會立即析構
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 0
}

面試官:你知道vector<bool>是如何實現的嗎?

二師兄:vector<bool>的實現和其他實現容器的實現不一致。每個元素被當作一個位而不是一個位元組存儲。這導致我們不能直接訪問該元素,也無法對每個元素取地址(8個元素可能在同一個位元組中存儲)。所以不建議使用vector<bool>,必要時可以使用std::bitset替代。

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

今天二師兄表現不錯,同時要感謝小伙伴的耐心閱讀。讓我們一起期待明天二師兄的面試之旅吧。

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


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

-Advertisement-
Play Games
更多相關文章
  • 見過好多大項目,一個解決方案好多個項目,網站、動態庫、測試等。放在不同的文件夾下,感覺很好。下麵介紹一下方法。 首先創建一個空白解決方案 會自動創建MultiFolder解決方案目錄。 ![img](https://img2023.cnblogs.com/blog/108012/202306/108 ...
  • 產品設計出來之後啊,大家使用的時候覺得反過來使用更加便捷。但是屏幕顯示是反的。那怎麼辦那????? 修改硬體費時費工,那能否軟體實現那????? 如果純軟體使用那就太費系統資源了。於是就想到了使用全志R528 自帶的G2D功能(硬體加速功能)。 使用它進行旋轉,後又發現uboot階段系統沒有G2D導 ...
  • 1. 背景 日誌領域是Elasticsearch(ES)最重要也是規模最大的應用場景之一。這得益於 ES 有高性能倒排索引、靈活的 schema、易用的分散式架構,支持高吞吐寫入、高性能查詢,同時有強大的數據治理生態、端到端的完整解決方案。但原生 ES 在高吞吐寫入、低成本存儲、高性能查詢等方面還有 ...
  • 上一篇文章 [我在 vscode 插件里接入了 ChatGPT,解決了代碼變數命名的難題](https://www.cnblogs.com/jaycewu/p/17476198.html) 中,展示瞭如何在 vscode 插件中使用 ChatGPT 解決代碼變數命名的問題。vscode 插件市場中有 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 今天我們來談一談系統複雜度的根源之【高性能】 對性能的不懈追求一直是人類科技持續發展的核心動力。例如電腦,從電子管電腦到晶體管電腦,再到集成電路電腦,運算性能從每秒幾次提高到每秒幾億次。然而,隨著性能的提升,相應的方法和系統複雜度也逐漸增加。現代電腦CPU集成了數億顆晶體管,其邏輯複雜度和 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • kkfileview是一個開源的文件文檔線上預覽項目解決方案。該項目使用流行的spring boot搭建,易上手和部署以及二次開發,並提供Docker鏡像發行包,方便在容器環境部署。基本支持主流辦公文檔的線上預覽。支持word excel ppt,pdf等辦公文檔支持txt,java,php,py,... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...