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

C++之list容器介紹及使用方式

 更新時(shí)間:2023年02月05日 15:57:12   作者:安河橋畔  
這篇文章主要介紹了C++之list容器介紹及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、list底層結(jié)構(gòu)

list底層是帶頭節(jié)點(diǎn)的雙向循環(huán)鏈表

  • 雙向:可以從前往后,也可以從后往前遍歷
  • 循環(huán):找尾節(jié)點(diǎn)的時(shí)間復(fù)雜度為O( 1 )
  • 帶頭節(jié)點(diǎn):代碼實(shí)現(xiàn)簡(jiǎn)單,不用考慮鏈表為空等特殊情況,可令end()迭代器指向頭節(jié)點(diǎn)的位置

二、構(gòu)造方法

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

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 };

拷貝構(gòu)造函數(shù)

利用l1拷貝構(gòu)造l2

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

三、元素訪問和迭代器

back&front

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

三種遍歷方式

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

采用下面三種方式對(duì)下面這個(gè)list<int>類型的對(duì)象進(jìn)行遍歷打?。?/p>

1.迭代器

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

打印結(jié)果:

2.范圍for

注意這里e是int類型,不用再進(jìn)行解引用

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

打印結(jié)果:

3.反向迭代器

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

打印結(jié)果:

四、元素修改

尾插、頭插、尾刪、頭刪

insert、erase

list支持任意位置的插入,注意list對(duì)象的迭代器不支持加減數(shù)字,因?yàn)槠涞讓涌臻g不連續(xù),如圖:

如果要往一個(gè)位置進(jìn)行插入,可以通過find函數(shù)返回位置進(jìn)行,find是一個(gè)通用的函數(shù)模板,返回值是傳入?yún)?shù)的迭代器類型,

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());//任意位置的刪除

swap

list內(nèi)置的交換函數(shù)

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

resize

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

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

五、特殊操作

remove

刪除值為value的元素

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

remove_if

remove_if的參數(shù)是一個(gè)判斷條件,可以是函數(shù)指針或者函數(shù)對(duì)象

//判斷5的倍數(shù)
bool MultipleFive(int n)
{
	return 0 == n % 5;
}

void Test10()
{
	//此處傳遞函數(shù)指針
	list<int> l1{ 10,0,1,3,5,7,20 };
	l1.remove_if(MultipleFive);
}

unique、sort

unique,去重,刪除所有重復(fù)元素,使用unique之前要先調(diào)用sort進(jìn)行排序,這里的sort是list內(nèi)置的sort,不是標(biāo)準(zhǔn)庫中的sort

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

結(jié)果:

對(duì)于sort的使用,還可以自定義函數(shù),并將函數(shù)指針作為參數(shù)傳遞給sort函數(shù)進(jìn)行排序:

reverse

對(duì)鏈表進(jìn)行逆置

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

結(jié)果:

六、list迭代器失效問題

list底層結(jié)構(gòu)為帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表,因此在list中進(jìn)行插入時(shí)是不會(huì)導(dǎo)致list的迭代器失效的,只有在刪除時(shí)才會(huì)失效,并且失效的只是指向被刪除節(jié)點(diǎn)的迭代器,其他迭代器不會(huì)受到影響。 

erase導(dǎo)致的迭代器失效

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

改正方法:

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

這里 l1.erase(it++)語句也能達(dá)到效果,因?yàn)楹笾?+會(huì)將自增后的結(jié)果保存在臨時(shí)變量中,而前置則不可以。 

resize導(dǎo)致的迭代器失效

resize減少有效元素個(gè)數(shù)也會(huì)導(dǎo)致迭代器失效:

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

上面這個(gè)程序中,reseze減少有效元素個(gè)數(shù)后,it指向的位置元素已經(jīng)被刪除,迭代器失效,如果再使用該迭代器,則會(huì)出錯(cuò)。

七、vector與list對(duì)比

vector(動(dòng)態(tài)順序表)

list(帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表)

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • C++多繼承(多重繼承)的實(shí)現(xiàn)

    C++多繼承(多重繼承)的實(shí)現(xiàn)

    多繼承容易讓代碼邏輯復(fù)雜、思路混亂,本文主要介紹了C++多繼承(多重繼承)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • OpenCV基于背景減除實(shí)現(xiàn)行人計(jì)數(shù)

    OpenCV基于背景減除實(shí)現(xiàn)行人計(jì)數(shù)

    本文主要介紹了如何使用OpenCV C++對(duì)視頻中的人流量進(jìn)行統(tǒng)計(jì)。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以了解一下
    2022-01-01
  • c語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡(jiǎn)單實(shí)例

    c語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄猚語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • Qt使用Json的項(xiàng)目實(shí)踐

    Qt使用Json的項(xiàng)目實(shí)踐

    JSON是一種對(duì)源自Javascript的對(duì)象數(shù)據(jù)進(jìn)行編碼的格式,但現(xiàn)在被廣泛用作互聯(lián)網(wǎng)上的數(shù)據(jù)交換格式,本文主要介紹了Qt使用Json的項(xiàng)目實(shí)踐,詳細(xì)的介紹了主要使用的類以及Json實(shí)戰(zhàn),感興趣的可以了解一下
    2023-09-09
  • C語言函數(shù)調(diào)用約定和返回值詳情

    C語言函數(shù)調(diào)用約定和返回值詳情

    這篇文章主要介紹了C語言函數(shù)調(diào)用約定和返回值詳情,函數(shù)調(diào)用約定不同,會(huì)影響函數(shù)生成的符號(hào)名,函數(shù)入?yún)㈨樞颍螀?nèi)存的清理者,更多相關(guān)需要的小伙伴可以參考下文詳情介紹
    2022-07-07
  • C++設(shè)計(jì)模式之適配器模式

    C++設(shè)計(jì)模式之適配器模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之適配器模式,本文詳細(xì)講解了C++中的適配器模式,并給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • C語言數(shù)字圖像處理之直方圖均衡化

    C語言數(shù)字圖像處理之直方圖均衡化

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)字圖像處理之直方圖均衡化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ 11和C++98相比有哪些新特性

    C++ 11和C++98相比有哪些新特性

    C++11標(biāo)準(zhǔn)提供了許多有用的新特性。這篇文章特別針對(duì)使C++11和C++98相比看上去像一門新語言的特性
    2017-03-03
  • C++實(shí)現(xiàn)頭文件保護(hù)機(jī)制

    C++實(shí)現(xiàn)頭文件保護(hù)機(jī)制

    頭文件保護(hù)機(jī)制是一種防止頭文件被重復(fù)包含的技術(shù),它主要借助 #ifndef、#define 和 #endif 這些預(yù)處理指令來達(dá)成,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2025-04-04

最新評(píng)論

黔西| 泽普县| 年辖:市辖区| 梓潼县| 临海市| 黎川县| 洪江市| 岑溪市| 祁东县| 蒙阴县| 获嘉县| 辉县市| 东台市| 林口县| 民和| 勃利县| 达尔| 高陵县| 定日县| 镇远县| 大渡口区| 岑溪市| 绥芬河市| 阿拉善左旗| 精河县| 清远市| 盐山县| 鹤壁市| 班玛县| 石狮市| 什邡市| 滦平县| 株洲市| 彰化市| 安庆市| 中西区| 临朐县| 江城| 桦南县| 嘉黎县| 肃宁县|