鍊錶總結之STL中迭代器失效問題

2021-08-19 17:20:13 字數 3143 閱讀 5347

這裡主要介紹鍊錶的基本知識,加深對鍊錶的了解,以及關於鍊錶的常見的面試題。最後介紹stl中的迭代器失效的問題

1.概念

鍊錶是一種物理儲存結構上非連續/非順序的儲存結構。鍊錶的每個結點裡面儲存著下乙個結點的指標,把儲存資料元素的資料串鏈起來。

2.結點組成

資料域:儲存資料元素

3.分類

單鏈表:是一種邏輯上的線性結構,只有一條鏈,首尾不相連,方向不會改變。

雙向鍊錶:指標域有兩個指標,分別指向它的前驅結點和後繼個結點。

迴圈鍊錶:尾結點的指標域的指標指向頭結點(頭尾相連形成乙個環形結構) 

4.優缺點

優點:

1.建立結點:克服預先知道資料大小的缺點,充分利用計算機空間,實現靈活的記憶體動態管理。

2.刪除結點:刪除結點時只需要修改結點的指標域,不需要將其他資料向前移動。

注:優缺點一般是相對於順序儲存。

缺點:

1.訪問結點:通過迴圈或遞迴訪問到鍊錶的資料,訪問效率低於線性資料結構。

2、儲存方面:增加結點的指標域,空間開銷比較大。

二、鍊錶的實現

1.單鏈表

單鏈表結構

插入結點

}}刪除結點

}}2.雙向鍊錶

插入結點

}

刪除結點

else if(pos == _head)//頭刪

else if(pos == _tail)//尾刪

else //一般情況

delete pos;

}

3.雙向迴圈鍊錶

插入結點&刪除結點

list()

:_head(new node(t()))

templatevoid list::insert(node* pos, const t& x)

templatevoid list::erase(node* pos)

三、stl中list

1.各界面

2.迭代器失效問題

3.實現(迭代器實現)

template//通過例項化的型別不同,實現不同的迭代器

struct _listiterator

ref operator* () //*操作符過載

self& operator++() //後置++

self operator++(int)//前置++

self& operator--() //後置--

self operator--(int) //前置--

bool operator != (const self&s )

bool operator == (const self&s)

ptr operator->()

};

總結:從單鏈表到雙向迴圈鍊錶,可以發現雙向迴圈鍊錶簡化增加和刪除操作,具體使用哪種鍊錶還依情況而定。對於stl中的list可以說極大的方面了使用者操作,迭代器也很好的實現了封裝。

有關於鍊錶的具體實現詳見:

STL之迭代器失效

所謂迭代器失效,是指迭代器已經不是指向原來的位置,這總是出現在需要連續儲存的容器中,如 vector,deque,string。拿vector來說,當需要插入或者刪除元素時,如果原來的容量 capacity 不足以滿足插入的需求,則必須重新分配一塊記憶體,然後將vector物件中所有元素都搬新家,這...

STL迭代器失效情況總結

define crt secure no warnings include include include include include include using namespace std void stl vector test cout it cout endl cout 插在迭代器指向的...

STL 容器迭代器失效總結

本文只總結常見的序列容器 vector deque list 和關聯容器 set multiset map multimap 的迭代器失效問題。原迭代器指的是進行操作之前儲存的迭代器,包括begin end 以及其他位置的迭代器。vector 成員函式push back 會在容器末尾新增乙個元素。如...