国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

list和vector容器的插入與訪問操作區(qū)別

這篇具有很好參考價值的文章主要介紹了list和vector容器的插入與訪問操作區(qū)別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

std::liststd::vector是C++中的兩種常見數(shù)據(jù)結構,它們在不同的使用場景下各有優(yōu)勢。

  • std::vector的內(nèi)部實現(xiàn)是動態(tài)數(shù)組,它在連續(xù)的內(nèi)存塊中存儲數(shù)據(jù)。這使得std::vector訪問元素時具有非常高的效率,因為可以直接通過索引來訪問元素,時間復雜度為O(1)。然而,std::vector在插入和刪除元素時可能需要移動大量的元素,特別是在非尾部進行插入或刪除操作時,時間復雜度為O(n)。
  • std::list的內(nèi)部實現(xiàn)是雙向鏈表,它在非連續(xù)的內(nèi)存塊中存儲數(shù)據(jù)。這使得std::list插入和刪除元素時具有非常高的效率,因為你只需要修改相關節(jié)點的指針,無需移動其他元素時間復雜度為O(1)。然而,std::list在訪問元素時可能需要遍歷整個鏈表,時間復雜度為O(n)。

如果主要的操作是插入元素insert操作,那么使用std::list會比使用std::vector更高效。

list插入元素和vector插入元素對比案例

leetcode406.根據(jù)身高重建隊列

vector的做法

class Solution {
public:
    //注意cmp接收的是兩個一維數(shù)組,而不是二維數(shù)組
    static bool cmp(vector<int>& P1,vector<int>& P2){
        if(P1[0]>P2[0])  return true;//整體降序
        if(P1[0]==P2[0]){
            if(P1[1]<P2[1]) 
                return true;//p1[0]相同的時候按照p1[1]升序
        }
        return false;
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        //先對所有的hi降序排序,因為本題的people中的變量是{a,b},所以需要自定義sort cmp
        sort(people.begin(),people.end(),cmp);
        //定義新的二維數(shù)組作為輸出
        vector<vector<int>>result;
        //開始遍歷排序后的people
        for(int i=0;i<people.size();i++){
            //因為此時已經(jīng)排序完畢,所以[6,1]直接插入到下標為1的地方,[5,0]直接插入下標為0的地方
            int position=people[i][1];//people[i][1]就代表著第i個集合people的第二個元素!
            //元素放到對應的二維結果數(shù)組里
            result.insert(result.begin()+position,people[i]);
        }
        return result;

    }
};

list和vector容器的插入與訪問操作區(qū)別,CPP語法、容器相關與易錯點記錄,list,數(shù)據(jù)結構,leetcode,c++

list優(yōu)化的做法

class Solution {
public:
    static bool cmp(vector<int>& P1,vector<int>& P2){
        if(P1[0]>P2[0])  return true;
        if(P1[0]==P2[0]){
            if(P1[1]<P2[1]) 
                return true;
        }
        return false;
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);
        //結果數(shù)組類型修改為list<vector<int>>
        list<vector<int>>result;
        
        //遍歷排序后的people
        for(int i=0;i<people.size();i++){
            int position=people[i][1];
            //找到position位置之后,定義迭代器再插入
            list<vector<int>>::iterator it = result.begin();
            //注意這里insert的寫法,先尋找插入位置
            while(position--){
                it++;
            }
            //while結束之后找到插入位置
            result.insert(it,people[i]);
        }
        //把結果轉(zhuǎn)換為vector<vector<int>>,相當于構造新的二維vector
        return vector<vector<int>>(result.begin(),result.end());

    }
};

list和vector容器的插入與訪問操作區(qū)別,CPP語法、容器相關與易錯點記錄,list,數(shù)據(jù)結構,leetcode,c++
其直觀上來看數(shù)組的insert操作是O(n)的,整體代碼的時間復雜度是O(n^2)。
鏈表的insert查找+插入也是O(n),整體代碼時間復雜度是一樣的。

為什么時間復雜度相同還會有性能差異

對于普通數(shù)組,一旦定義了大小就不能改變,例如int a[10];,這個數(shù)組a至多只能放10個元素,改不了的。

對于動態(tài)數(shù)組,就是可以不用關心初始時候的大小,可以隨意往里放數(shù)據(jù),那么耗時的原因就在于動態(tài)數(shù)組的底層實現(xiàn)。

那么動態(tài)數(shù)組為什么可以不受初始大小的限制,可以隨意push_back數(shù)據(jù)呢?

首先vector的底層實現(xiàn)也是普通數(shù)組。

vector的大小有兩個維度一個是size一個是capicity,size就是我們平時用來遍歷vector時候用的,例如:

for (int i = 0; i < vec.size(); i++) {

}

capicity是vector底層數(shù)組(就是普通數(shù)組)的大小,capicity不一定=size。

當insert數(shù)據(jù)的時候,如果已經(jīng)大于capicity,capicity會成倍擴容,但對外暴漏的size其實僅僅是+1。

那么既然vector底層實現(xiàn)是普通數(shù)組,怎么擴容的?

就是重新申請一個二倍于原數(shù)組大小的數(shù)組,然后把數(shù)據(jù)都拷貝過去,并釋放原數(shù)組內(nèi)存。

舉一個例子,如圖:
list和vector容器的插入與訪問操作區(qū)別,CPP語法、容器相關與易錯點記錄,list,數(shù)據(jù)結構,leetcode,c++
原vector中的size和capicity相同都是3,初始化為1 2 3,此時要push_back一個元素4。

那么底層其實就要申請一個大小為6的普通數(shù)組,并且把原元素拷貝過去,釋放原數(shù)組內(nèi)存,注意圖中底層數(shù)組的內(nèi)存起始地址已經(jīng)變了。

同時也注意此時capicity和size的變化,是成倍改變的!

而在本案例中,我們使用vector來做insert的操作,此時大家可會發(fā)現(xiàn),雖然表面上復雜度是O(n2),但是,其底層都不知道額外做了多少次全量拷貝了,所以算上vector的底層拷貝,整體時間復雜度可以認為是O(n^2 + t × n)級別的,t是底層拷貝的次數(shù)

所以,雖然插入操作的理論時間復雜度沒有改變,但 在實踐中,由于std::list不需要移動元素,所以實際運行時間會更短。這就是為什么使用std::list后代碼運行時間減少的原因。

參考:
代碼隨想錄-vector和list差別解釋文章來源地址http://www.zghlxwxcb.cn/news/detail-535533.html

到了這里,關于list和vector容器的插入與訪問操作區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【c++】 list容器的基本操作與接口

    【c++】 list容器的基本操作與接口

    List容器是一個雙向鏈表。 采用動態(tài)存儲分配,不會造成內(nèi)存浪費和溢出 鏈表執(zhí)行插入和刪除操作十分方便,修改指針即可,不需要移動大量元素 鏈表靈活,但是空間和時間額外耗費較大 list構造函數(shù) list數(shù)據(jù)元素插入和刪除操作 list大小操作 list賦值操作 l ist數(shù)據(jù)的存取 li

    2024年02月17日
    瀏覽(28)
  • C++STL——list容器及其常用操作(詳解)

    C++STL——list容器及其常用操作(詳解)

    縱有疾風起,人生不言棄。本文篇幅較長,如有錯誤請不吝賜教,感謝支持。 鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。 鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態(tài)

    2024年02月14日
    瀏覽(26)
  • C++ string類(2)—成員訪問、插入、刪除、替換、查找和交換操作

    C++ string類(2)—成員訪問、插入、刪除、替換、查找和交換操作

    目錄 一、成員訪問 1、operator[ ]at 2、front( )back( ) 二、插入元素 insert( ) 三、刪除元素 erase( ) 四、替換元素 replace( ) 五、查找元素 find( ) 六、交換字符串 swap( ) 七、C風格?c_str 八、rfindsubstr 雖然二者功能一樣,但[ ]比較常用。 訪問越界[ ]會直接報錯,.at( )會拋異常。 insert/er

    2024年02月05日
    瀏覽(29)
  • Docker - 基本概念、與虛擬機的區(qū)別、架構、鏡像操作、容器操作、數(shù)據(jù)卷掛載

    Docker - 基本概念、與虛擬機的區(qū)別、架構、鏡像操作、容器操作、數(shù)據(jù)卷掛載

    目錄 一、對 Docker? 的理解 1、Docker 基本概念 2、Docker 與 虛擬機的區(qū)別 3、何為鏡像和容器? 4、Docker 主要架構 二、Docker 基本操作 1、Docker 鏡像操作 2、案例(鏡像):去 DockerHub 搜索并拉取一個 Nginx 鏡像,打包后刪除鏡像,重新加載 .tar 文件 3、Docker 容器操作 1.docker run(啟

    2024年04月13日
    瀏覽(25)
  • CPP語法(六)——函數(shù)模板

    模板是c++的高級特性,分為函數(shù)模板和類模板。標準模板庫(STL) 模板只作用于其下方的類或函數(shù) 1.1 函數(shù)模板 函數(shù)模板定義 template 為,表示定義一個模板,尖括號表示模板參數(shù)。 模板參數(shù)主要有兩種:一種是模板類型參數(shù),另一種是模板非類型參數(shù)。 1.2 重載函數(shù)模板

    2024年04月26日
    瀏覽(17)
  • Cpp學習——list的模擬實現(xiàn)

    Cpp學習——list的模擬實現(xiàn)

    ? 目錄 一,實現(xiàn)list所需要包含的三個類 二,三個類的實現(xiàn) 1.list_node 2.list類 ?3.iterator_list類 三,功能實現(xiàn) 1.list類里的push_back() ??2.iterator類里的運算符重載 3,list類里面的功能函數(shù) 1.insert() 2.erase()函數(shù) 3.clear()與析構函數(shù) 4.拷貝構造函數(shù)賦值運算符重載 5.打印函數(shù) ? ? ?因

    2024年02月12日
    瀏覽(17)
  • 【List】List集合有序測試案例:ArrayList,LinkedList,Vector(123)

    List是有序、可重復的容器。 有序: List中每個元素都有索引標記??梢愿鶕?jù)元素的索引標記(在List中的位置)訪問 元素,從而精確控制這些元素。 可重復: List允許加入重復的元素。更確切地講,List通常允許滿足 e1.equals(e2) 的元素重復加入容器。 List接口常用的實現(xiàn)類有3個:

    2024年02月11日
    瀏覽(18)
  • Vector<T> 動態(tài)數(shù)組(模板語法)

    Vector<T> 動態(tài)數(shù)組(模板語法)

    C++數(shù)據(jù)結構與算法 目錄 1 C++自學精簡教程 目錄(必讀) 2 動態(tài)數(shù)組 Vector(難度1) 其中,2 是 1 中的一個作業(yè)。2 中詳細講解了動態(tài)數(shù)組實現(xiàn)的基本原理。 1 學會寫基本的C++類模板語法; 2 為以后熟練使用 STL 打下基礎; 3 為更進一步的閱讀和掌握更多的C++庫打下基礎; 模板語

    2024年02月10日
    瀏覽(23)
  • 哈希表HashMap(基于vector和list)

    哈希表HashMap(基于vector和list)

    C++數(shù)據(jù)結構與算法實現(xiàn)(目錄) 1 什么是HashMap? 我們這里要實現(xiàn)的HashMap接口不會超過標準庫的版本(是一個子集)。 HashMap是一種鍵值對容器( 關聯(lián)容器 ),又叫 字典 。 和其他容易一樣,它可以對存儲的元素進行 增刪改查 操作。 它之所以叫關聯(lián)容器,是因為它的每個元

    2024年02月10日
    瀏覽(27)
  • C++面試:向量vector和列表list介紹

    目錄 vector list? list和vector的區(qū)別 1. 底層實現(xiàn): 2. 動態(tài)性和靜態(tài)性: 3. 內(nèi)存管理: 4. 迭代器和指針: 5. 訪問效率: 6. 適用場景: ? std::vector 是 C++ STL 提供的動態(tài)數(shù)組容器,提供了多種操作。以下是一些常見的 std::vector 操作,一一列舉出來 初始化和基本操作 插入和刪除元

    2024年01月22日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包