欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ List鏈表的介紹和使用

 更新時間:2023年03月07日 11:03:59   作者:東區(qū)東區(qū)!  
list是可以在常數(shù)范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代,這篇文章主要介紹了C++ List鏈表的介紹和使用,需要的朋友可以參考下

1. list的介紹及使用

1.1 list的介紹

1. list是可以在常數(shù)范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。

2. list的底層是雙向鏈表結構,雙向鏈表中每個元素存儲在互不相關的獨立節(jié)點中,在節(jié)點中通過指針指向其前一個元素和后一個元素。

3. list與forward_list非常相似:最主要的不同在于forward_list是單鏈表,只能朝前迭代,已讓其更簡單高效。

4. 與其他的序列式容器相比(array,vector,deque),list通常在任意位置進行插入、移除元素的執(zhí)行效率更好。

5. 與其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的隨機訪問,比如:要訪問list的第6個元素,必須從已知的位置(比如頭部或者尾部)迭代到該位置,在這段位置上迭代需要線性的時間開銷;list還需要一些額外的空間,以保存每個節(jié)點的相關聯(lián)信息(對于存儲類型較小元素的大list來說這可能是一個重要的因素)

list的底層:帶頭節(jié)點雙向鏈表結構

1.2 list的使用

使用list要帶上頭文件’

#include<list>

1.2.1 list的構造

//構造打印練習
void TestList()
{
    list<int>L1;
    //十個值為5
    list<int>L2(10,5);
 
    //區(qū)間方式構造
    vector<int>v{ 0,3,35,34,2 };
    list<int>L3(v.begin(),v.end());
 
    //拷貝構造
    list<int>L4(L3);
 
    //列表構造
    list<int>L5{ 1,23,34 };
 
    //打印,范圍for
    for (auto e:L2)
    {
        cout << e << " ";
    }
    cout << endl;
 
    //迭代器打印
    auto it = L3.begin();
    while (it != L3.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;
}

1.2.2 list iterator的使用

1. begin與end為正向迭代器,對迭代器執(zhí)行++操作,迭代器向后移動

2. rbegin(end)與rend(begin)為反向迭代器,對迭代器執(zhí)行++操作,迭代器向前移動

1.2.3 list capacity

1.2.4 list element access

1.2.5 list modififiers

上面一些方法的使用,都很簡單,隨意測試一下

void TestList()
{
    list<int>L;
    L.push_back(1);
    L.push_back(2);
    L.push_back(3);
    L.push_back(4);
    L.push_back(5);
 
    cout << L.size() << endl;
    cout << L.front() << endl;//訪問起始位置
    cout << L.back() << endl;//訪問末尾
 
    L.front() = 50;
    L.back() = 1000;
 
    L.pop_back();//刪除list中最后一個元素
 
    cout << L.size() << endl;
    cout << L.front() << endl;
    cout << L.back() << endl;
}

任意位置的插入

void TestList()
{
    list<int>L;
    L.push_back(1);
    L.push_back(2);
    L.push_back(3);
    L.push_back(4);
    L.push_back(5);
    PrintList(L);
 
    auto pos = L.begin();
    L.insert(pos, 0);//在1的位置插入0,插入之前
    PrintList(L);
 
    cout << *pos << endl;//查看迭代器是否正常使用
    
    //在鏈表中值為data的節(jié)點前插入10個值為2的元素
    int data = 0;
    cin >> data;
    
    //在這個區(qū)間內找data,返回pos。如果沒找到返回end
    pos= find(L.begin(),L.end(),data);
 
    if (pos != L.end())
    {
        L.insert(pos, 10, 2);
    }
    PrintList(L);
 
    //區(qū)間形式
    pos = L.begin();
    vector<int>v{ 10,20,34,34,1244 };
    L.insert(pos, v.begin(), v.end());
    PrintList(L);
}

1.2.6 list的迭代器失效

void TestList()
{
    list<int>L;
    L.push_back(1);
    L.push_back(2);
    L.push_back(3);
    L.push_back(4);
    L.push_back(5);
    PrintList(L);
 
    auto pos1 = L.begin();
    auto pos2 = find(L.begin(),L.end(),5);
    cout << *pos2 << endl;
 
    L.erase(pos1);//將pos1位置處元素刪除
    PrintList(L);
 
    cout << *pos2 << endl;//檢測迭代器是否失效
    cout << *pos1 << endl;
    //結果是pos2正常,pos1失效
}

erase會導致刪除位置的迭代器失效,但是對于其他位置的迭代器沒有影響。

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

2. list的模擬實現(xiàn)

模擬實現(xiàn)具體可以參閱網上文章

3. list與vector的對比

vector

list

動態(tài)順序表,一段連續(xù)空間

帶頭結點的雙向循環(huán)鏈表

支持隨機訪問,訪問某個元素效率O(1)

不支持隨機訪問,訪問某個元素效率O(N)

任意位置插入和刪除效率低,需要搬移元素,時間復雜度為O(N),插入時有可能需要增容,增容:開辟新空間,拷貝元素,釋放舊空間,導致效率更低

任意位置插入和刪除效率高,不需要搬移元素,時間復雜度為O(1)

底層為連續(xù)空間,不容易造成內存碎片,空間利用率高,緩存利用率高

底層節(jié)點動態(tài)開辟,小節(jié)點容易造成內存碎片,空間利用率低,緩存利用率低

原生態(tài)指針

對原生態(tài)指針(節(jié)點指針)進行封裝

在插入元素時,要給所有的迭代器重新賦值,因為插入元素有可能會導致重新擴容,致使原來迭代器失效,刪除時,當前迭代器需要重新賦值否則會失效

插入元素不會導致迭代器失效,刪除元素時,只會導致當前迭代器失效,其他迭代器不受影響

使

需要高效存儲,支持隨機訪問,不關心插入刪除效率

大量插入和刪除操作,不關心隨

機訪問

到此這篇關于C++ List鏈表的介紹和使用的文章就介紹到這了,更多相關C++ List鏈表內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)影院管理系統(tǒng)

    C語言實現(xiàn)影院管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)影院管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中的volatile關鍵字及其作用

    C++中的volatile關鍵字及其作用

    本文介紹了C++中的volatile關鍵字,它用于標識變量可能被意外修改,以及編譯器不應進行優(yōu)化。本文通過具體的代碼示例,闡述了volatile關鍵字的作用和使用方法,幫助讀者更好地了解該關鍵字在C++語言中的應用場景和實現(xiàn)原理
    2023-04-04
  • 關于C++中push_back()函數(shù)的用法及代碼實例

    關于C++中push_back()函數(shù)的用法及代碼實例

    push_back是vector的一個方法,表示將一個元素存儲到容器的末尾,下面這篇文章主要給大家介紹了關于C++中push_back()函數(shù)用法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例

    C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例

    這篇文章主要介紹了C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • C++ OpenCV生成蒙太奇圖像的示例詳解

    C++ OpenCV生成蒙太奇圖像的示例詳解

    圖片的蒙太奇效果,一般稱為馬賽克圖。由很多小圖拼接成一個大圖。這篇文章主要為大家介紹如何利用C++ OpenCV實現(xiàn)生成蒙太奇圖像,感興趣的可以了解一下
    2022-01-01
  • C語言文件操作大全

    C語言文件操作大全

    這篇文章主要介紹了C語言文件操作大全的相關資料,需要的朋友可以參考下
    2018-03-03
  • C++代碼實現(xiàn)五子棋小游戲

    C++代碼實現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細介紹了C++代碼實現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Unix下C程序內存泄漏檢測工具Valgrind的安裝與使用詳解

    Unix下C程序內存泄漏檢測工具Valgrind的安裝與使用詳解

    以下是對Unix下C程序內存泄漏檢測工具Valgrind的安裝與使用進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言對數(shù)組元素進行冒泡排序的實現(xiàn)

    C語言對數(shù)組元素進行冒泡排序的實現(xiàn)

    這篇文章主要介紹了C語言對數(shù)組元素進行冒泡排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Windows下CMake的下載與安裝過程

    Windows下CMake的下載與安裝過程

    CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程),這篇文章主要介紹了Windows下CMake的下載與安裝,需要的朋友可以參考下
    2022-02-02

最新評論