vector和list的區別是什么

vector? 和 ?list? 都是C++ 標準模板庫(STL)中的容器,它們的區別如下:

?

內存結構

?

- ?vector?:是連續的內存空間,就像數組一樣,元素在內存中依次排列。

?

- ?list?:是由節點組成的雙向鏈表,每個節點包含數據和指向前一個及后一個節點的指針,節點在內存中不連續。

?

隨機訪問

?

- ?vector?:支持隨機訪問,可以通過下標快速訪問元素,時間復雜度為 O(1)。

?

- ?list?:不支持隨機訪問,要訪問某個元素,需要從鏈表頭或尾開始逐個遍歷,時間復雜度為 O(n)。

?

插入和刪除操作

?

- ?vector?:在尾部插入和刪除元素效率較高,時間復雜度為 O(1)。但在中間或頭部插入和刪除元素時,需要移動大量元素,效率較低,時間復雜度為 O(n)。

?

- ?list?:在任何位置插入和刪除元素都非常高效,只需修改相應節點的指針,時間復雜度為 O(1)。

?

迭代器

?

- ?vector?:迭代器是普通指針,支持 ?++?、?--?、?+n?、?-n? 等操作,可以直接進行算術運算來訪問不同位置的元素。

?

- ?list?:迭代器是雙向鏈表的節點指針,只支持 ?++? 和 ?--? 操作來逐個遍歷鏈表。

?

空間占用

?

- ?vector?:由于是連續內存,可能會預分配一些額外空間,以減少重新分配內存的次數,因此實際占用空間可能比存儲元素所需空間略大。

?

- ?list?:每個節點除了存儲數據外,還需要額外的空間存儲指針,所以對于大量數據,?list? 的空間占用可能比 ?vector? 大。

?

在實際應用中,如果需要頻繁隨機訪問元素,?vector? 是較好的選擇;如果需要頻繁在容器中間插入和刪除元素,?list? 更為合適。

#include <iostream>

#include <vector>

#include <list>

?

void printVector(const std::vector<int>& vec) {

? ? for (const auto& num : vec) {

? ? ? ? std::cout << num << " ";

? ? }

? ? std::cout << std::endl;

}

?

void printList(const std::list<int>& lst) {

? ? for (const auto& num : lst) {

? ? ? ? std::cout << num << " ";

? ? }

? ? std::cout << std::endl;

}

?

int main() {

? ? // vector用法示例

? ? std::vector<int> vec;

? ? // 尾部插入元素

? ? vec.push_back(1);

? ? vec.push_back(2);

? ? vec.push_back(3);

?

? ? std::cout << "Vector: ";

? ? printVector(vec);

?

? ? // 隨機訪問元素

? ? std::cout << "Element at index 1: " << vec[1] << std::endl;

?

? ? // 在中間插入元素

? ? vec.insert(vec.begin() + 1, 4);

? ? std::cout << "Vector after insertion: ";

? ? printVector(vec);

?

? ? // 刪除元素

? ? vec.erase(vec.begin() + 2);

? ? std::cout << "Vector after deletion: ";

? ? printVector(vec);

?

? ? // list用法示例

? ? std::list<int> lst;

? ? // 頭部插入元素

? ? lst.push_front(5);

? ? lst.push_front(4);

? ? lst.push_front(3);

?

? ? std::cout << "List: ";

? ? printList(lst);

?

? ? // 在中間插入元素

? ? auto it = lst.begin();

? ? std::advance(it, 1);

? ? lst.insert(it, 6);

? ? std::cout << "List after insertion: ";

? ? printList(lst);

?

? ? // 刪除元素

? ? it = lst.begin();

? ? std::advance(it, 2);

? ? lst.erase(it);

? ? std::cout << "List after deletion: ";

? ? printList(lst);

?

? ? return 0;

}

?

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

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

相關文章

【AI】【AIGC】降低AIGC檢測率:技術、挑戰與應對策略

引言 隨著生成式人工智能&#xff08;AIGC&#xff09;技術的迅速發展&#xff0c;越來越多的內容開始由人工智能生成。AIGC技術的應用非常廣泛&#xff0c;包括文本生成、圖像生成、音頻生成等。然而&#xff0c;隨著這些技術的普及&#xff0c;如何有效識別并檢測AIGC生成的…

vue3 ts 請求封裝后端接口

一 首頁-廣告區域-小程序 首頁-廣告區域-小程序 GET/home/banner1.1 請求封裝 首頁-廣告區域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函數定…

響應式CMS架構優化SEO與用戶體驗

內容概要 在數字化內容生態中&#xff0c;響應式CMS架構已成為平衡搜索引擎可見性與終端用戶體驗的核心載體。該系統通過多終端適配技術&#xff0c;確保PC、移動端及平板等設備的內容渲染一致性&#xff0c;直接降低頁面跳出率并延長用戶停留時長。與此同時&#xff0c;智能S…

算法基礎篇(1)(藍橋杯常考點)

算法基礎篇 前言 算法內容還有搜索&#xff0c;數據結構&#xff08;進階&#xff09;&#xff0c;動態規劃和圖論 數學那個的話大家也知道比較難&#xff0c;放在最后講 這期包含的內容可以看目錄 模擬那個算法的話就是題說什么寫什么&#xff0c;就不再分入目錄中了 注意事…

MyBatis一級緩存和二級緩存

介紹 在開發基于 MyBatis 的應用時&#xff0c;緩存是提升性能的關鍵因素之一。MyBatis 提供了一級緩存和二級緩存&#xff0c;合理使用它們可以顯著減少數據庫的訪問次數&#xff0c;提高系統的響應速度和吞吐量。本文將深入探討 MyBatis 一級緩存和二級緩存的工作原理、使用…

C++核心語法快速整理

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 本文主要為學過多門語言玩家快速入門C 沒有基礎的就放棄吧。 全部都是精華&#xff0c;看完能直接上手改別人的項目。 輸出內容 std::代表了這里的cout使用的標準庫&#xff0c;避免不同庫中的相同命名導致混亂 …

如何讓自動駕駛汽車“看清”世界?坐標映射與數據融合概述

在自動駕駛領域,多傳感器融合技術是實現車輛環境感知和決策控制的關鍵。其中,坐標系映射和對應是多傳感器融合的重要環節,它涉及到不同傳感器數據在統一坐標系下的轉換和匹配,以實現對車輛周圍環境的準確感知。本文將介紹多傳感器融合中坐標系映射和對應的數學基礎和實際應…

Unity Shader 的編程流程和結構

Unity Shader 的編程流程和結構 Unity Shader 的編程主要由以下三個核心部分組成&#xff1a;Properties&#xff08;屬性&#xff09;、SubShader&#xff08;子著色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它們的具體作用和結構&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是計算機科學中一項重要的操作&#xff0c;它將一組數據元素按照特定的順序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通過時間復雜度和空間復雜度來衡量。在 Python 中&#xff0c;有內置的排序函數&#xff0c;同時也可以手…

移除idea External Liraries 中maven依賴包

問題背景 擴展包里面不停的出現已經在POM文件注釋的包&#xff0c;其實是沒有查詢到根源位置。 在IDEA插件中搜索Maven Helper 點擊pom.xml文件 會出現擴展插件 定位之后在pom中添加exclusions&#xff0c;如下代碼 <dependency><groupId>com.disney.eva.framewo…

AI革命!藍耘攜手海螺AI視頻,打造智能化視頻新紀元

AI革命&#xff01;藍耘攜手海螺AI視頻&#xff0c;打造智能化視頻新紀元 前言 在這個信息爆炸的時代&#xff0c;視頻已經成為我們獲取信息、學習新知識的重要方式。而隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI與視頻內容的結合為我們帶來了全新的…

dify1.1.1安裝

1、 按照GitHub上操作 下載源碼&#xff0c;沒有安裝git的&#xff0c;可以下載成zip包&#xff0c; unzip 解壓 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、啟動前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可觀測性最佳實踐

ElasticSearch 概述 ElasticSearch 是一個開源的高擴展的分布式全文檢索引擎&#xff0c;它可以近乎實時的存儲、檢索數據&#xff1b;本身擴展性很好&#xff0c;可以擴展到上百臺服務器&#xff0c;處理 PB 級別&#xff08;大數據時代&#xff09;的數據。ES 也使用 Java 開…

Excel處理控件Spire.XLS系列教程:C# 在 Excel 中添加或刪除單元格邊框

單元格邊框是指在單元格或單元格區域周圍添加的線條。它們可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引讀者注意重要的單元格或使工作表看起來更美觀。本文將介紹如何使用 Spire.XLS for .NET 在 C# 中添加或刪除 Excel 單元格邊框。 安裝 Spire.XLS for .NET E-…

前端Wind CSS面試題及參考答案

目錄 標準盒模型與 IE 盒模型的區別是什么?如何通過 box-sizing 屬性切換這兩種盒模型? 如何計算一個元素在標準盒模型下的總寬度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?請列舉至少 3 種清除浮動的方法。 方法一:使用 clear 屬性 方法二:使用…

基于 ECharts 實現動態圖表渲染支持10萬+數據點實時更新方案

引言 實現支持10萬數據點實時更新的動態圖表渲染確實具有挑戰性&#xff0c;尤其是在性能和用戶體驗方面。以下是一些關鍵點和應用場景&#xff1a; 關鍵挑戰 性能優化&#xff1a; 渲染性能&#xff1a;大量數據點會導致瀏覽器渲染壓力大&#xff0c;可能引發卡頓。數據處理…

裝飾器模式 (Decorator Pattern)

裝飾器模式 (Decorator Pattern) 是一種結構型設計模式,它動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活。 一、基礎 1 意圖 動態地給一個對象添加一些額外的職責。 就增加功能來說,裝飾器模式相比生成子類更為靈活。 2 適用場景 當…

【Java】TCP網絡編程:從可靠傳輸到Socket實戰

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

藍橋杯C++基礎算法-0-1背包

這段代碼實現了一個經典的0-1 背包問題的動態規劃解法。0-1 背包問題是指給定一組物品&#xff0c;每個物品有其體積和價值&#xff0c;要求在不超過背包容量的情況下&#xff0c;選擇物品使得總價值最大。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&am…

html5炫酷的科技感3D文字效果實現詳解

炫酷的科技感3D文字效果實現詳解 這里寫目錄標題 炫酷的科技感3D文字效果實現詳解項目概述核心技術實現1. 3D文字效果2. 故障藝術效果&#xff08;Glitch Effect&#xff09;3. 動態網格背景4. 掃描線效果5. 粒子效果 性能優化考慮技術難點與解決方案項目總結擴展優化方向 項目…