面試之快速學習STL- vector

1. vector底層實現機制刨析:

簡述:使用三個迭代器表示的:

在這里插入圖片描述

這也就解釋了,為什么 vector 容器在進行擴容后,與其相關的指針、引用以及迭代器可能會失效的原因。

insert

整體向后移

erase

整體向前移

size 變化會重新reserve

2. emplace_back()和push_back()的區別

emplace_back() 和 push_back() 的區別,就在于底層實現的機制不同。push_back() 向容器尾部添加元素時,首先會創建這個元素,然后再將這個元素拷貝或者移動到容器中(如果是拷貝的話,事后會自行銷毀先前創建的這個元素);而 emplace_back() 在實現時,則是直接在容器尾部創建這個元素,省去了拷貝或移動元素的過程。

3. 避免不必要的擴容:

那既然擴容會影響程序的運行效率,那我們如何來避免呢?
在插入元素之前,我們可以預估vector里面要存儲多少個元素,我們提前將這個空間給它開辟好就可以了!!!
比如說,我們需要向vector中插入100個元素,在執行push_back之前,我們進行reserver預留空間,只要空間大小給的足夠,在整個插入的過程中就不需要進行任何的擴容!

4. 減小不必要的容量

1 . shrink_to_fit()
2 . Swap
如果想用 swap() 成員方法去除當前 vector 容器多余的容量時,可以套用如下的語法格式:
vector(x).swap(x);

1. #include <iostream>
2. #include <vector>
3. using namespace std;
4. 
5. int main()
6. {
7.     vector<int>myvector;
8.     //手動為 myvector 擴容
9.     myvector.reserve(1000);
10.     cout << "1、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;
11.     //利用 myvector 容器存儲 10 個元素
12.     for (int i = 1; i <= 10; i++) {
13.         myvector.push_back(i);
14.     }
15.     //將 myvector 容量縮減至 10
16.     vector<int>(myvector).swap(myvector);
17.     cout << "2、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;
18.     return 0;
19. }

輸出:

1、當前 myvector 擁有 0 個元素,容量為 1000
2、當前 myvector 擁有 10 個元素,容量為 10

顯然,第 16 行代碼成功將 myvector 容器的容量 1000 修改為 10,此行代碼的執行流程可細分為以下 3 步:

  1. 先執行 vector(myvector),此表達式會調用 vector 模板類中的拷貝構造函數,從而創建出一個臨時的 vector 容器(后續稱其為 tempvector)。
    值得一提的是,tempvector 臨時容器并不為空,因為我們將 myvector 作為參數傳遞給了復制構造函數,該函數會將 myvector 容器中的所有元素拷貝一份,并存儲到 tempvector 臨時容器中。
    注意,vector 模板類中的拷貝構造函數只會為拷貝的元素分配存儲空間。換句話說,tempvector 臨時容器中沒有空閑的存儲空間,其容量等于存儲元素的個數。
  2. 然后借助 swap() 成員方法對 tempvector 臨時容器和 myvector 容器進行調換,此過程不僅會交換 2 個容器存儲的元素,還會交換它們的容量。換句話說經過 swap() 操作,myvetor 容器具有了 tempvector 臨時容器存儲的所有元素和容量,同時 tempvector 也具有了原 myvector 容器存儲的所有元素和容量。
  3. 當整條語句執行結束時,臨時的 tempvector 容器會被銷毀,其占據的存儲空間都會被釋放。注意,這里釋放的其實是原 myvector 容器占用的存儲空間。
    經過以上 3 個步驟,就成功的將 myvector 容器的容量由 100 縮減至 10。

當 swap() 成員方法用于清空 vector 容器時,可以套用如下的語法格式:
vector().swap(x);

4. vector < bool >

具體來講,不推薦使用 vector 的原因有以下 2 個:

1. 嚴格意義上講,vector<bool> 并不是一個 STL 容器;
2. vector<bool> 底層存儲的并不是 bool 類型值。

值得一提的是,對于是否為 STL 容器,C++ 標準庫中有明確的判斷條件,其中一個條件是:如果 cont 是包含對象 T 的 STL 容器,且該容器中重載了 [ ] 運算符(即支持 operator[]),則以下代碼必須能夠被編譯:

T *p = &cont[0];

此行代碼的含義是,借助 operator[ ] 獲取一個 cont 容器中存儲的 T 對象,同時將這個對象的地址賦予給一個 T 類型的指針。
這就意味著,如果 vector 是一個 STL 容器,則下面這段代碼是可以通過編譯的:

//創建一個 vector 容器

vectorcont{0,1};

//試圖將指針 p 指向 cont 容器中第一個元素

bool *p = &cont[0];

但不幸的是,此段代碼不能通過編譯。原因在于 vector 底層采用了獨特的存儲機制。

實際上,為了節省空間,vector 底層在存儲各個 bool 類型值時,每個 bool 值都只使用一個比特位(二進制位)來存儲。也就是說在 vector 底層,一個字節可以存儲 8 個 bool 類型值。在這種存儲機制的影響下,operator[ ] 勢必就需要返回一個指向單個比特位的引用,但顯然這樣的引用是不存在的,等號左右兩邊出現沖突!

么,如果在實際場景中需要使用 vector< bool > 這樣的存儲結構,該怎么辦呢?很簡單,可以選擇使用 deque< bool > 或者 bitset 來替代 vector

要知道,deque 容器幾乎具有 vecotr 容器全部的功能(擁有的成員方法也僅差 reserve() 和 capacity()),而且更重要的是,deque 容器可以正常存儲 bool 類型元素。

還可以考慮用 bitset 代替 vector,其本質是一個模板類,可以看做是一種類似數組的存儲結構。和后者一樣,bitset 只能用來存儲 bool 類型值,且底層存儲機制也采用的是用一個比特位來存儲一個 bool 值。

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

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

相關文章

關于uniapp微信小程序scroll-view組件使用show-scrollbar隱藏不了滾動條

這里關于使用 scroll-view組件 時候有滾動條 想要隱藏滾動條但是使用show-scrollbar沒有效果 這時候又使用類名隱藏滾動條 使用id隱藏滾動條都不行 解決方法&#xff1a;在使用 scroll-view組件 的頁面或者app 頁面加上以下代碼就可以了 ::-webkit-scrollbar {displa…

53.Linux day03 文件查看命令,vi/vim常用命令

今天進行了新的學習。 目錄 1.cat a.查看單個文件的內容&#xff1a; b.查看多個文件的內容&#xff1a; c.將多個文件的內容連接并輸出到一個新文件&#xff1a; d.顯示帶有行號的文件內容&#xff1a; 2.more 3.less 4.head 5.tail 6.命令模式 7.插入模式 8.圖…

BBS項目day04 文章詳情頁、點贊點菜、評論功能

一、路由 from django.contrib import admin from django.urls import path, re_path from app01 import views from django.views.static import serve from django.conf import settingsurlpatterns [path(admin/, admin.site.urls),# 注冊path(register/, views.register)…

【3Ds Max】布料命令的簡單使用

簡介 在3ds Max中&#xff0c;"布料"&#xff08;Cloth&#xff09;是一種模擬技術&#xff0c;用于模擬物體的布料、織物或軟體的行為&#xff0c;例如衣物、帆布等。通過應用布料模擬&#xff0c;您可以模擬出物體在重力、碰撞和其他外力作用下的變形和動態效果。…

蘋果審核:傳完包,郵箱收到 ITMS-90078: Missing Push Notification Entitlement

郵件原文&#xff1a; We identified one or more issues with a recent delivery for your app, "***" 1.0. Your delivery was successful, but you may wish to correct the following issues in your next delivery: ITMS-90078: Missing Push Notification En…

Java尋找數組的中心下標

目錄 1.題目描述 2.題解 分析 具體實現 1.題目描述 給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和…

【C++ 記憶站】引用

文章目錄 一、引用概念二、引用特性1、引用在定義時必須初始化2、一個變量可以有多個引用3、引用一旦引用一個實體&#xff0c;再不能引用其他實體 三、常引用四、使用場景1、做參數1、輸出型參數2、大對象傳參 2、做返回值1、傳值返回2、傳引用返回 五、傳值、傳引用效率比較六…

label引用圖片出現??

參考latex 引用圖片“\ref figure”_latex \ref加上前綴fig_Junruiqwertyuiop的博客-CSDN博客 label需要放在caption后面&#xff0c;如 \caption{Overview of BERT.} \label{BERT} 猜測&#xff0c;label可能會根據圖表或者公式的caption與圖表或公式綁定并編號&#xff0…

【MT32F006】MT32F006之CS1237采集秤傳感器

本文最后修改時間&#xff1a;2023年06月07日 一、本節簡介 本文介紹如何使用MT32F006連接CS1237芯片采集秤傳感器。 二、實驗平臺 庫版本&#xff1a;V1.0.0 編譯軟件&#xff1a;MDK5.37 硬件平臺&#xff1a;MT32F006開發板&#xff08;主芯片MT32F006&#xff09; 仿真…

Chrome命令行開關

Electron 支持的命令行開關 –client-certificatepath 設置客戶端的證書文件 path . –ignore-connections-limitdomains 忽略用 , 分隔的 domains 列表的連接限制. –disable-http-cache 禁止請求 HTTP 時使用磁盤緩存. –remote-debugging-portport 在指定的 端口 通…

ORACLE中判斷表是否存在再刪除表避免報錯與MySql和SqlServer的不同

不同數據庫中drop a table if it exists的不同&#xff1a; In MySQL it is pretty easy to drop a table if it exists already. In Oracle and Microsoft’s SQL Server it is a little more complicated. Today I want to present you the solutions for these two DBMS’.…

常見的CRM系統報價

一個CRM系統大概多少錢&#xff1f;CRM系統的價格因為不同的廠商、功能、部署方式、用戶數等因素而有很大的差異&#xff0c;沒有一個固定的標準。但是&#xff0c;我們可以根據一些常見的CRM軟件的報價&#xff0c;對CRM價格有一個大致的了解。 一、CRM的部署方式 CRM系統的…

【RocketMQ】快速入門

文章目錄 消費模式同步消息異步消息單向消息延遲消息批量消息順序消息事務消息Tag標簽和Key鍵Tag的使用Key的使用 首先引入rocketmq的依賴 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><ve…

HackNos 3靶場

配置 進入控制面板配置網卡 第一步&#xff1a;啟動靶機時按下 shift 鍵&#xff0c; 進入以下界面 第二步&#xff1a;選擇第二個選項&#xff0c;然后按下 e 鍵&#xff0c;進入編輯界面 將這里的ro修改為rw single init/bin/bash&#xff0c;然后按ctrlx&#xff0c;進入…

數據結構的圖存儲結構

目錄 數據結構的圖存儲結構 圖存儲結構基本常識 弧頭和弧尾 入度和出度 (V1,V2) 和 的區別,v2> 集合 VR 的含義 路徑和回路 權和網的含義 圖存儲結構的分類 什么是連通圖&#xff0c;&#xff08;強&#xff09;連通圖詳解 強連通圖 什么是生成樹&#xff0c;生…

springboot集成ES

1.引入pom依賴2.application 配置3.JavaBean配置以及ES相關注解 3.1 Student實體類3.2 Teacher實體類3.3 Headmaster 實體類4. 啟動類配置5.elasticsearchRestTemplate 新增 5.1 createIndex && putMapping 創建索引及映射 5.1.1 Controller層5.1.2 service層5.1.3 ser…

leetcode做題筆記85最大矩形

給定一個僅包含 0 和 1 、大小為 rows x cols 的二維二進制矩陣&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面積。 示例 1&#xff1a; 思路一&#xff1a;單調棧 int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){int dp[matrixSize…

使用MAT分析OOM問題

OOM和內存泄漏在我們的工作中&#xff0c;算是相對比較容易出現的問題&#xff0c;一旦出現了這個問題&#xff0c;我們就需要對堆進行分析。 一般情況下&#xff0c;我們生產應用都會設置這樣的JVM參數&#xff0c;以便在出現OOM時&#xff0c;可以dump出堆內存文件&#xff…

基于libevent的tcp服務器

libevent使用教程_evutil_make_socket_nonblocking_易方達藍籌的博客-CSDN博客 一、準備 centos7下安裝libevent庫 yum install libevent yum install -y libevent-devel 二、代碼 server.cpp /** You need libevent2 to compile this piece of code Please see: http://li…

專訪 BlockPI:共建賬戶抽象未來的新一代 RPC 基礎設施

在傳統 RPC 服務板塊上&#xff0c;開發者一直飽受故障風險、運行環境混亂等難題的折磨。實現 RPC 服務的去中心化&#xff0c;且保持成本優勢和可擴展性&#xff0c;始終是區塊鏈基礎設施建設的重要命題之一。從 2018 年觀察中心化 RPC 供應商服務現狀開始&#xff0c;BlockPI…