C 學習篇 8 序列式容器list

2021-10-14 07:54:21 字數 2079 閱讀 6171

list

個人認為list相當於資料結構裡面的雙向鍊錶,但是實現功能更加複雜。它的好處是每次插入或刪除元素時,就要配置或釋放乙個元素空間,因此,對空間不會產生浪費,對於任何位置的元素插入或刪除是都是o(1)的時間複雜度。

list節點

list迭代器

注意:在list中使用erase只會使得當前迭代器失效,其他位置的元素在在迭代器訪問時不會失效。

原因是:vector是連續的線性儲存空間,當刪除元素時,從當前位置後的所有元素都需要向前移動一位,這就導致後面元素的迭代器完全失效,但是對於list來說,其儲存元素時不連續的儲存空間,所以刪除當前元素不會對其他位置的元素產生影響,也不會導致其他位置的迭代器失效。

list資料結構(環狀雙向鍊錶)

list使用方法

//建立ilist

listilist;

//獲取ilist物件大小

cout << "size = " << ilist.size() << endl; //size = 0;

//新增元素

ilist.push_back(0);

ilist.push_back(1);

ilist.push_back(2);

ilist.push_back(3);

//遍歷資料,迭代器it的原本型別是 it = list::iterator;

for(auto it = ilist.begin(); it != ilist.end(); ++it)

cout << endl;

//查詢元素

list::iterator itf = find(ilist.begin(), ilist.end(), 3);

//插入元素

ilist.insert(ilist.begin(), 99);

//刪除元素

ilist.erase(ilist.begin());

list和vector的區別?1、list不能夠像vector一樣以普通指標作為迭代器,因為節點不保證連續的儲存空間; 但是vector是連續的線性儲存空間,當容量不足時會進行2/1.5倍擴容操作;

2、list插入和刪除操作不會引起其他元素的迭代器失效,但是vector會;

3、list不僅是雙向鍊錶,而且是環狀雙向鍊錶,所以它的迭代器是雙向迭代器,只需要乙個指標 ;

4、list不像vector那樣可以在空間不足的時候重新配置、資料移動的操作,所以插入前的所有迭代器都是有效的。

5、相較於vector直接分配連續的空間來說。list節點每次插入和刪除都需要分配和釋放空間;

6、vector的查詢時間複雜度為o(1),但是插入和刪除為o(n);list的插入和刪除時間複雜度為o(1),但是查詢為o(n);

7、可以從缺頁中斷談起,因為對於vector是連續的線性儲存空間,所以對於資料訪問時產生的缺頁中斷次數更少,最差情況下也僅需要少量的頁面換入換出即可,但是list是不連續的儲存空間,所以導致缺頁中斷的機率更高。

4 序列式容器

template class vector 成員函式舉例 注意其中的記憶體管理 void vector insert iterator position,size type n,const t x else else ifdef stl use exceptions catch endif stl ...

STL學習筆記 序列式容器list

由於vector的使用,經常會出現迭代器錯誤,主要是因為vector在每次更改完資料就會重新配置,迭代器就會失效,list的結構和vector的設計差異決定了list在這方面具有優越性,list的insert和splice操作不會造成迭代器失效,並且erase也只會是讓當前元素的迭代器失效。list...

STL學習2 序列容器

三種 vector,list,queue 基礎 陣列,鍊錶,陣列 支援函式 front,back,push back,pop back 可以動態的改變它的大小,可以彼此賦值,但陣列表示位址常量就沒這功能。vector就像陣列一樣,是連續的。在末尾插入非常高效,中間就不行。要想經常在兩端插入刪除,最好...