最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中l(wèi)ist容器的實(shí)現(xiàn)

 更新時(shí)間:2023年03月31日 10:18:50   作者:Darren_pty  
本文主要介紹了C++中l(wèi)ist容器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、list容器

1.1 簡介

① 功能:將數(shù)據(jù)進(jìn)行鏈?zhǔn)酱鎯?chǔ)。

② 鏈表(list)是一種物理存儲(chǔ)單元上非連續(xù)的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接實(shí)現(xiàn)的。

③ 鏈表的組成:鏈表由一系列結(jié)點(diǎn)組成。

④ 結(jié)點(diǎn)的組成:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。

⑤ 添加元素,將原指向下一個(gè)元素的指針指向新元素即可,新元素指向下一個(gè)元素

⑥ STL中的鏈表是一個(gè)雙向循環(huán)鏈表。

  • 雙向:每一個(gè)指針既指向下一個(gè)結(jié)點(diǎn)的元素,也指向上一個(gè)結(jié)點(diǎn)的元素。
  • 循環(huán):最后一個(gè)結(jié)點(diǎn)的指針會(huì)指向第一個(gè)結(jié)點(diǎn)的元素,第一個(gè)結(jié)點(diǎn)的指針會(huì)指向最后一個(gè)結(jié)點(diǎn)的元素。

⑦ 由于鏈表的存儲(chǔ)方式并不是連續(xù)的內(nèi)存空間,因此鏈表list中的迭代器只支持前移和后移,屬于雙向迭代器。

  • 它只能通過指針域一個(gè)一個(gè)前移/后移去找,而不能連續(xù)的內(nèi)存空間,指針加一個(gè)數(shù)字,就可以找到數(shù)據(jù)。

⑧ list的優(yōu)點(diǎn):

  • 采用動(dòng)態(tài)存儲(chǔ)分配,不會(huì)造成內(nèi)存浪費(fèi)和溢出。
  • 鏈表執(zhí)行插入和刪除操作十分方便,修改指針即可,不需要移動(dòng)大量數(shù)據(jù)。

⑨ list的缺點(diǎn):

  • 鏈表靈活,但是空間(指針域)和時(shí)間(遍歷)額外耗費(fèi)較大。

10.list有一個(gè)重要的性質(zhì),插入操作和刪除操作都不會(huì)造成原有l(wèi)ist迭代器的失效,這在vector中是不成立的,vector當(dāng)插入操作會(huì)創(chuàng)建一個(gè)更大的數(shù)據(jù)內(nèi)容,而vector容器的迭代器卻指向原有內(nèi)存,所以原有的vector容器失效了。

11.STL中l(wèi)ist和vector是兩個(gè)最長被用的容器,各有優(yōu)缺點(diǎn)。

1.2 構(gòu)造函數(shù)

① 功能描述:創(chuàng)建list容器。

② 函數(shù)原型:

list lst; //list采用模板類實(shí)現(xiàn)對象的默認(rèn)構(gòu)造形式
list(beg,end); //構(gòu)造函數(shù)將[beg,end)區(qū)間中的元素拷貝給本身。
list(n,elem); //構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。
list(const list &lst); //拷貝構(gòu)造函數(shù)。

③ list構(gòu)造方式同其他幾個(gè)STL容器一樣。

#include<iostream>
using namespace std;
#include <list>
 
void printList(const list<int>&L)
{
    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
 
void test01()
{
    //創(chuàng)建list容器
    list<int>L1;  //默認(rèn)構(gòu)造
 
    //添加數(shù)據(jù)
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
 
    //遍歷容器
    printList(L1);
 
    //區(qū)間方式構(gòu)造
    list<int>L2(L1.begin(), L1.end());
    printList(L2);
 
    //拷貝構(gòu)造
    list<int>L3(L2);
    printList(L3);
 
    //n個(gè)elem
    list<int>L4(10, 1000);
    printList(L4);
    
}
 
int main() {
 
    test01();
 
    system("pause");
 
    return 0;
 
}

運(yùn)行結(jié)果:

10 20 30 40
10 20 30 40
10 20 30 40
1000 1000 1000 1000 1000 1000 1000 1000 1000 1000
請按任意鍵繼續(xù). . .

1.3 賦值和交換

① 功能描述:給list容器進(jìn)行賦值,以及交換list容器。

② 函數(shù)原型:

assign(beg,end); //將[beg,end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。
assign(n,elem); //將n個(gè)elem拷貝賦值給本身。
list& operator=(const list &list); //重載等號(hào)操作符。
swap(list); //將lst與本身的元素互換。
#include<iostream>
using namespace std;
#include <list>
 
//list容器賦值和交換
 
void printList(const list<int>&L)
{
    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
 
void test01()
{
    //創(chuàng)建list容器
    list<int>L1;  //默認(rèn)構(gòu)造
 
    //添加數(shù)據(jù)
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
 
    //遍歷容器
    printList(L1);
 
    list<int>L2;
    L2 = L1;  //operator= 賦值
    printList(L2);
 
    list<int>L3;
    L3.assign(L2.begin(), L2.end());
    printList(L3);
 
    list<int>L4;
    L4.assign(10, 100);
    printList(L4);
 
}
 
//交換
void test02()
{
    //創(chuàng)建list容器
    list<int>L1;  //默認(rèn)構(gòu)造
    
    //添加數(shù)據(jù)
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
 
    list<int>L2;
    L2.assign(10, 100);
 
    cout << "交換前:" << endl;
    printList(L1);
    printList(L2);
 
    L1.swap(L2);
    cout << "交換后:" << endl;
    printList(L1);
    printList(L2);
}
 
int main() {
 
    test01();
    test02();
 
    system("pause");
 
    return 0;
 
}

運(yùn)行結(jié)果:

10 20 30 40
10 20 30 40
10 20 30 40
100 100 100 100 100 100 100 100 100 100
交換前:
10 20 30 40
100 100 100 100 100 100 100 100 100 100
交換后:
100 100 100 100 100 100 100 100 100 100
10 20 30 40
請按任意鍵繼續(xù). . .

1.4 大小操作

① 功能描述:對list容器的大小進(jìn)行操作。

② 函數(shù)原型:

//返回容器中元素的個(gè)數(shù)。

size();

//判斷容器是否為空。

empty();

//重新指定容器的長度為num,若容器變長,則以默認(rèn)值填充新位置。

//如果容器變短,則末尾超出容器長度的元素被刪除。

resize(num);

//重新指定容器的長度為num,若容器變成,則以elem值填充新位置。

//如果容器變短,則末尾超出容器長度的元素被刪除。

resize(num,elem);
#include<iostream>
using namespace std;
#include <list>
 
//list容器賦值和交換
 
void printList(const list<int>&L)
{
    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
 
void test01()
{
    //創(chuàng)建list容器
    list<int>L1;  //默認(rèn)構(gòu)造
 
    //添加數(shù)據(jù)
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
 
    //遍歷容器
    printList(L1);
 
    //判斷容器是否為空
    if(L1.empty())
    {
        cout << "L1為空" << endl;
    }
    else
    {
        cout << "L1不為空:" << endl;
        cout << "L1的元素個(gè)數(shù)為:" << L1.size() << endl;
    }
 
    //重新指定大小
    L1.resize(10,10000);
    printList(L1);
 
    L1.resize(2);
    printList(L1);
}
 
int main() {
 
    test01();
    
    system("pause");
 
    return 0;
 
}

運(yùn)行結(jié)果:

10 20 30 40
L1不為空:
L1的元素個(gè)數(shù)為:4
10 20 30 40 10000 10000 10000 10000 10000 10000
10 20
請按任意鍵繼續(xù). . .

1.5 插入和刪除

① 功能描述:對list容器進(jìn)行數(shù)據(jù)的插入和刪除。

② 函數(shù)原型:

push_back(elem); //在容器尾部加入一個(gè)元素。
pop_back(); //刪除容器中最后一個(gè)元素。
push_front(elem); //在容器開頭插入一個(gè)元素。
pop_front(); //從哪個(gè)容器開頭移除第一個(gè)元素
insert(pos,elem); //在pos位置插e(cuò)lem元素的拷貝,返回新數(shù)據(jù)的位置。
insert(pos,n,elem); //在pos位置插入n個(gè)elem數(shù)據(jù),無返回值。
insert(pos,beg,end); //在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。
clear(); //移除容器的所有數(shù)據(jù)。
erase(beg,end); //刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。
erase(pos); //刪除pos位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。
remove(elem); //刪除容器中所有與elem值匹配的元素。
#include<iostream>
using namespace std;
#include <list>
 
//list容器賦值和交換
 
void printList(const list<int>&L)
{
    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
 
void test01()
{
    //創(chuàng)建list容器
    list<int>L1;  //默認(rèn)構(gòu)造
 
    //添加數(shù)據(jù)
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
 
    L1.push_front(100);
    L1.push_front(200);
    L1.push_front(300);
 
    //遍歷容器
    printList(L1);
 
    //尾刪
    L1.pop_back();
    printList(L1);
 
    //頭刪
    L1.pop_front();
    printList(L1);
 
    //insert插入
    list<int>::iterator it = L1.begin();
    L1.insert(++it, 1000);
    printList(L1);
 
    //刪除
    it = L1.begin();
    L1.erase(it);
    printList(L1);
 
    //移除
    L1.push_back(10000);
    L1.push_back(10000);
    L1.push_back(10000);
    L1.push_back(10000);
    printList(L1);
 
    L1.remove(10000);
    printList(L1);
 
    //清空
    L1.clear();
    printList(L1);
 
}
 
int main() {
 
    test01();
 
    system("pause");
 
    return 0;
 
}

運(yùn)行結(jié)果:

300 200 100 10 20 30
300 200 100 10 20
200 100 10 20
200 1000 100 10 20
1000 100 10 20
1000 100 10 20 10000 10000 10000 10000
1000 100 10 20
請按任意鍵繼續(xù). . .

1.6 數(shù)據(jù)存取

① 功能描述:對list容器中數(shù)據(jù)進(jìn)行存取。

② 函數(shù)原型:

front(); //返回第一個(gè)元素。
back(); //返回最后一個(gè)元素。

③ list容器不是連續(xù)的內(nèi)存空間,所以不能通過[]、at等方式隨機(jī)訪問。

#include<iostream>
using namespace std;
#include <list>
 
//list容器  數(shù)據(jù)存取
 
void printList(const list<int>&L)
{
    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
 
void test01()
{
    //創(chuàng)建list容器
    list<int>L1;  //默認(rèn)構(gòu)造
 
    //添加數(shù)據(jù)
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
 
    //L1[0] 不可以用[]訪問list容器中的元素
 
    //L1.at(0) 不可以用at方式訪問list容器中的元素
 
    //原因是list本質(zhì)鏈表,不是用連續(xù)線性空間存儲(chǔ)數(shù)據(jù),迭代器也是不支持隨機(jī)訪問的。
 
    cout << "第一個(gè)元素為:" << L1.front() << endl;
 
    cout << "第一個(gè)元素為:" << L1.back() << endl;
 
    //驗(yàn)證迭代器是不支持隨機(jī)訪問的
 
    list<int>::iterator it = L1.begin();
 
    it++;  //因?yàn)閘ist是雙向的,所以支持遞增、遞減++、--的操作,但是不支持it = it+1;it = it+2;....,即不支持這樣的隨機(jī)訪問      
 
}
 
int main() {
 
    test01();
 
    system("pause");
 
    return 0;
 
}

運(yùn)行結(jié)果:

第一個(gè)元素為:10
第一個(gè)元素為:40
請按任意鍵繼續(xù). . .

1.7 反轉(zhuǎn)和排序

① 功能描述:將容器中的元素反轉(zhuǎn),以及將容器中的數(shù)據(jù)進(jìn)行排序。

② 函數(shù)原型:

reverse(); //反轉(zhuǎn)鏈表
sort(); //鏈表排序
#include<iostream>
using namespace std;
#include <list>
#include<algorithm>
 
//list容器  反轉(zhuǎn)和排序
 
void printList(const list<int>&L)
{
    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
 
bool myCopare(int v1, int v2)
{
    //降序 就讓第一個(gè)數(shù) 大于第二個(gè)數(shù)為真
    return v1 > v2;
 
}
 
void test01()
{
    //反轉(zhuǎn)
    list<int>L1;  
 
    //添加數(shù)據(jù)
    L1.push_back(20);
    L1.push_back(10);
    L1.push_back(50);
    L1.push_back(40);
    L1.push_back(30);
 
    cout << "反轉(zhuǎn)前:" << endl;
    printList(L1);
 
    //反轉(zhuǎn)
    L1.reverse();
    cout << "反轉(zhuǎn)后:" << endl;
    printList(L1);
 
    //排序
    cout << "排序前:" << endl;
    printList(L1);
 
    //所有不支持隨機(jī)訪問迭代器的容器,不可以用標(biāo)準(zhǔn)算法
    //不支持隨機(jī)訪問迭代器的容器,內(nèi)部會(huì)提供對應(yīng)的一些算法
    //sort(L1.begin(),L1.end());  //報(bào)錯(cuò),這是標(biāo)準(zhǔn)算法,全局函數(shù)的sort()
    L1.sort();  //默認(rèn)排序規(guī)則 從小到大 升序
    cout << "排序后:" << endl;
    printList(L1);
 
    L1.sort(myCopare);  //降序排列 這是成員函數(shù)的sort()
    cout << "重載排序算法,降序排序后:" << endl;
    printList(L1);
    
}
 
 
int main() 
{
    test01();
 
    system("pause");
 
    return 0;
}

運(yùn)行結(jié)果:

反轉(zhuǎn)前:
20 10 50 40 30
反轉(zhuǎn)后:
30 40 50 10 20
排序前:
30 40 50 10 20
排序后:
10 20 30 40 50
重載排序算法,降序排序后:
50 40 30 20 10
請按任意鍵繼續(xù). . . 

到此這篇關(guān)于C++中l(wèi)ist容器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ list容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問題

    c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問題

    這篇文章主要介紹了c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言用數(shù)組實(shí)現(xiàn)反彈球消磚塊

    C語言用數(shù)組實(shí)現(xiàn)反彈球消磚塊

    這篇文章主要為大家詳細(xì)介紹了C語言用數(shù)組實(shí)現(xiàn)反彈球消磚塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 在C++中如何阻止類被繼承詳解

    在C++中如何阻止類被繼承詳解

    這篇文章主要介紹了在C++中如何阻止類被繼承,對于C++初學(xué)者而言可以通過本文實(shí)例更好的理解類的原理及運(yùn)用,需要的朋友可以參考下
    2021-09-09
  • C語言學(xué)生成績管理系統(tǒng)小設(shè)計(jì)

    C語言學(xué)生成績管理系統(tǒng)小設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生成績管理系統(tǒng)小設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 一波C語言二元查找樹算法題目解答實(shí)例匯總

    一波C語言二元查找樹算法題目解答實(shí)例匯總

    這篇文章主要介紹了一波C語言二元查找樹算法題目解答實(shí)例匯總,包括按層次遍歷和轉(zhuǎn)換為鏡像等基本算法題目,需要的朋友可以參考下
    2016-03-03
  • C語言中的二叉樹和堆詳解

    C語言中的二叉樹和堆詳解

    這篇文章主要介紹了C語言中的二叉樹和堆詳解,樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合,把它叫做樹是因?yàn)樗雌饋硐褚豢玫箳斓臉?,也就是說它是根朝上,而葉朝下的,需要的朋友可以參考下
    2023-07-07
  • C++類與對象的詳細(xì)說明2

    C++類與對象的詳細(xì)說明2

    這篇文章主要為大家詳細(xì)介紹了C++的類與對象,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++讀取訪問權(quán)限沖突引發(fā)異常問題的原因分析

    C++讀取訪問權(quán)限沖突引發(fā)異常問題的原因分析

    C語言是一門通用計(jì)算機(jī)編程語言,廣泛應(yīng)用于底層開發(fā),最近在用C++寫代碼時(shí)經(jīng)常會(huì)遇到“引發(fā)了異常: 讀取訪問權(quán)限沖突,所以這篇文章主要給大家介紹了關(guān)于C++讀取訪問權(quán)限沖突引發(fā)異常問題的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++對cin輸入字符的判斷及分段函數(shù)處理方法示例

    C++對cin輸入字符的判斷及分段函數(shù)處理方法示例

    這篇文章主要介紹了C++對cin輸入字符的判斷及分段函數(shù)處理方法,結(jié)合實(shí)例形式分析了C++輸入判斷及處理相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • C語言調(diào)用Python代碼的方法

    C語言調(diào)用Python代碼的方法

    這篇文章主要介紹了C語言調(diào)用Python代碼的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07

最新評(píng)論

蓝田县| 繁峙县| 原阳县| 呼伦贝尔市| 阿拉善右旗| 同德县| 巴楚县| 大姚县| 大姚县| 黔南| 南城县| 台北市| 成武县| 武邑县| 巴彦县| 白水县| 崇明县| 娄底市| 桓台县| 秀山| 牙克石市| 富宁县| 三门峡市| 同心县| 泗洪县| 固始县| 天柱县| 武鸣县| 普格县| 五河县| 调兵山市| 五莲县| 丹阳市| 侯马市| 定日县| 杭锦后旗| 遵义县| 汽车| 沙洋县| 余江县| 景谷|