91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++之list容器如何使用

發布時間:2023-02-07 09:32:36 來源:億速云 閱讀:106 作者:iii 欄目:開發技術

今天小編給大家分享一下C++之list容器如何使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    一、list底層結構

    list底層是帶頭節點的雙向循環鏈表

    • 雙向:可以從前往后,也可以從后往前遍歷

    • 循環:找尾節點的時間復雜度為O( 1 )

    • 帶頭節點:代碼實現簡單,不用考慮鏈表為空等特殊情況,可令end()迭代器指向頭節點的位置

    C++之list容器如何使用

    二、構造方法

    構造函數

    list<int> l1;
    list<int> l2(5, 3);
    //迭代器
    vector<int> v{ 1,2,3,4,5 };
    list<int> l3(v.begin(), v.end());
    //C++11
    list<int> l4{ 1,2,3,4,5 };

    C++之list容器如何使用

    拷貝構造函數

    利用l1拷貝構造l2

    list<int> l1{ 1,2,3,4,5 };
    list<int> l2(l1);

    C++之list容器如何使用

    三、元素訪問和迭代器

    back&front

    list<int> l1{ 1,2,3,4,5 };
    cout << l1.front() << endl;
    cout << l1.back() << endl;

    C++之list容器如何使用

    三種遍歷方式

    list<int> l1{ 1,2,3,4,5 };

    采用下面三種方式對下面這個list<int>類型的對象進行遍歷打印:

    1.迭代器

    list<int>::iterator it = l1.begin();
    for (it; it != l1.end(); it++)
    {
    	cout << *it << " ";
    }
    cout << endl;

    打印結果:

    C++之list容器如何使用

    2.范圍for

    注意這里e是int類型,不用再進行解引用

    //范圍for
    for (auto e : l1)
    {
    	cout << e << " ";
    }
    cout << endl;

    打印結果:

    C++之list容器如何使用

    3.反向迭代器

    list<int>::reverse_iterator rit = l1.rbegin();
    for (rit; rit != l1.rend(); rit++)
    {
    	cout << *rit << " ";
    }
    cout << endl;

    打印結果:

    C++之list容器如何使用

    四、元素修改

    尾插、頭插、尾刪、頭刪

    C++之list容器如何使用

    insert、erase

    list支持任意位置的插入,注意list對象的迭代器不支持加減數字,因為其底層空間不連續,如圖:

    C++之list容器如何使用

    如果要往一個位置進行插入,可以通過find函數返回位置進行,find是一個通用的函數模板,返回值是傳入參數的迭代器類型

    list<int> l1{ 1,2,3,4,5 };
    l1.insert(find(l1.begin(), l1.end(), 3), 10);//任意位置插入
    l1.erase(find(l1.begin(), l1.end(), 10), l1.end());//任意位置的刪除

    C++之list容器如何使用

    swap

    list內置的交換函數

    list<int> l1{ 1,2,3,4,5 };
    list<int> l2{ 5,6,7,8,9 };
    l1.swap(l2);

    C++之list容器如何使用

    resize

    resize改變有效元素的個數,多的元素用第resize二個參數填充,如果沒有給第二個參數,則默認用T()。

    list<int> l1{ 0,1,2 };
    l1.resize(5, 3);

    C++之list容器如何使用

    五、特殊操作

    remove

    刪除值為value的元素

    list<int> l1{ 3,0,1,3,2,3 };
    l1.remove(3);

    C++之list容器如何使用

    remove_if

    remove_if的參數是一個判斷條件,可以是函數指針或者函數對象

    //判斷5的倍數
    bool MultipleFive(int n)
    {
    	return 0 == n % 5;
    }
    
    void Test10()
    {
    	//此處傳遞函數指針
    	list<int> l1{ 10,0,1,3,5,7,20 };
    	l1.remove_if(MultipleFive);
    }

    C++之list容器如何使用

    unique、sort

    unique,去重,刪除所有重復元素,使用unique之前要先調用sort進行排序,這里的sort是list內置的sort,不是標準庫中的sort

    void Test()
    {
    	list<int> l1{ 1,3,3,5,4,0,2,5,4 };
    	l1.sort();//默認升序
    	l1.unique();//刪除重復元素
    }

    結果:

    C++之list容器如何使用

    對于sort的使用,還可以自定義函數,并將函數指針作為參數傳遞給sort函數進行排序:

    C++之list容器如何使用

    reverse

    對鏈表進行逆置

    void Test()
    { 
    	list<int> l1{ 1,3,5,7,9 };
    	l1.reverse();
    }

    結果:

    C++之list容器如何使用

    六、list迭代器失效問題

    list底層結構為帶頭結點的雙向循環鏈表,因此在list中進行插入時是不會導致list的迭代器失效的,只有在刪除時才會失效,并且失效的只是指向被刪除節點的迭代器,其他迭代器不會受到影響。 

    erase導致的迭代器失效

    如圖所示,it迭代器所指向的位置被刪除后,迭代器失效:

    C++之list容器如何使用

    改正方法:

    while (it != l1.end())
    {
    	//it=l1.erase(it);
    	l1.erase(it++);
    }

    這里 l1.erase(it++)語句也能達到效果,因為后置++會將自增后的結果保存在臨時變量中,而前置則不可以。 

    resize導致的迭代器失效

    resize減少有效元素個數也會導致迭代器失效:

    list<int> l1{ 1,3,5,7,9 };
    auto it = l1.end();
    l1.resize(3);

    上面這個程序中,reseze減少有效元素個數后,it指向的位置元素已經被刪除,迭代器失效,如果再使用該迭代器,則會出錯。

    七、vector與list對比

    vector(動態順序表)

    C++之list容器如何使用

    list(帶頭結點的雙向循環鏈表)

    C++之list容器如何使用

    對比vectorlist
    底層結構動態順序表&#xff0c;連續空間帶頭結點的雙向循環鏈表
    訪問支持隨機訪問&#xff0c;首地址+下標不能隨機訪問&#xff0c;可通過find查找&#xff0c;訪問隨即元素時間復雜度O(N)
    插入刪除任意位置插入和刪除效率低&#xff0c;需要搬移元素&#xff0c;時間復雜度為O(N)&#xff0c;插入時有可能需要增容&#xff0c;增容&#xff1a;開辟新空間&#xff0c;拷貝元素&#xff0c;釋放舊空間&#xff0c;導致效率更低任意位置插入和刪除效率高&#xff0c;不需要搬移元素&#xff0c;時間復雜度為O(1)
    空間利用率底層為連續空間&#xff0c;不容易造成內存碎片&#xff0c;空間利用率較高&#xff0c;緩存利用率高。可以一次將一個數據附近的空間都加載到緩存&#xff0c;不用頻繁地從內存讀取數據底層節點動態開辟&#xff0c;容易造成內存碎片&#xff0c;空間利用率低&#xff0c;緩存利用率低
    迭代器原生態指針對指針進行了封裝
    迭代器失效容量相關的操作都有可能導致迭代器失效&#xff0c;如插入引起的擴容&#xff0c;刪除元素等插入元素不會導致迭代器失效&#xff0c;刪除節點會導致&#xff0c;且只影響當前迭代器&#xff0c;其他迭代器不受影響
    使用場景不關心插入和刪除效率&#xff0c;支持隨機訪問大量插入和刪除操作&#xff0c;不關心隨機訪問的場景

    以上就是“C++之list容器如何使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    栾川县| 无为县| 安远县| 翁牛特旗| 长沙县| 调兵山市| 龙南县| 宣武区| 高台县| 澄江县| 高碑店市| 哈巴河县| 永兴县| 沙田区| 四平市| 重庆市| 南康市| 通城县| 津南区| 杭锦后旗| 鹤峰县| 綦江县| 定西市| 黄大仙区| 文化| 晋中市| 临夏县| 华阴市| 安宁市| 驻马店市| 济源市| 原平市| 海兴县| 沙雅县| 双流县| 土默特左旗| 广东省| 长子县| 紫金县| 伊通| 行唐县|