<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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 };
利用l1拷貝構造l2
list<int> l1{ 1,2,3,4,5 }; list<int> l2(l1);
list<int> l1{ 1,2,3,4,5 }; cout << l1.front() << endl; cout << l1.back() << endl;
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;
列印結果:
2.範圍for
注意這裡e是int型別,不用再進行解除參照
//範圍for for (auto e : l1) { cout << e << " "; } cout << endl;
列印結果:
3.反向迭代器
list<int>::reverse_iterator rit = l1.rbegin(); for (rit; rit != l1.rend(); rit++) { cout << *rit << " "; } cout << endl;
列印結果:
list支援任意位置的插入,注意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());//任意位置的刪除
list內建的交換函數
list<int> l1{ 1,2,3,4,5 }; list<int> l2{ 5,6,7,8,9 }; l1.swap(l2);
resize改變有效元素的個數,多的元素用第resize二個引數填充,如果沒有給第二個引數,則預設用T()。
list<int> l1{ 0,1,2 }; l1.resize(5, 3);
刪除值為value的元素
list<int> l1{ 3,0,1,3,2,3 }; l1.remove(3);
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); }
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();//刪除重複元素 }
結果:
對於sort的使用,還可以自定義函數,並將函數指標作為引數傳遞給sort函數進行排序:
對連結串列進行逆置
void Test() { list<int> l1{ 1,3,5,7,9 }; l1.reverse(); }
結果:
list底層結構為帶頭結點的雙向迴圈連結串列,因此在list中進行插入時是不會導致list的迭代器失效的,只有在刪除時才會失效,並且失效的只是指向被刪除節點的迭代器,其他迭代器不會受到影響。
erase導致的迭代器失效
如圖所示,it迭代器所指向的位置被刪除後,迭代器失效:
改正方法:
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 | list |
---|---|---|
底層結構 | 動態順序表,連續空間 | 帶頭結點的雙向迴圈連結串列 |
存取 | 支援隨機存取,首地址+下標 | 不能隨機存取,可通過find查詢,存取隨即元素時間複雜度O(N) |
插入刪除 | 任意位置插入和刪除效率低,需要搬移元素,時間複雜度為O(N),插入時有可能需要增容,增容:開闢新空間,拷貝元素,釋放舊空間,導致效率更低 | 任意位置插入和刪除效率高,不需要搬移元素,時間複雜度為O(1) |
空間利用率 | 底層為連續空間,不容易造成記憶體碎片,空間利用率較高,快取利用率高。可以一次將一個資料附近的空間都載入到快取,不用頻繁地從記憶體讀取資料 | 底層節點動態開闢,容易造成記憶體碎片,空間利用率低,快取利用率低 |
迭代器 | 原生態指標 | 對指標進行了封裝 |
迭代器失效 | 容量相關的操作都有可能導致迭代器失效,如插入引起的擴容,刪除元素等 | 插入元素不會導致迭代器失效,刪除節點會導致,且隻影響當前迭代器,其他迭代器不受影響 |
使用場景 | 不關心插入和刪除效率,支援隨機存取 | 大量插入和刪除操作,不關心隨機存取的場景 |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45