list使用了不連續分配的記憶體
container:
:iterator iter , tempit;
for(iter = cont.
begin()
; iter != cont.
end();
)
假設cont是乙個container的示例,裡面包含數個元素,那麼當container為:1、vector 2、list 3、map 4、deque
時,會導致上面的**片段崩潰的container型別是?vector,deque
不過erase方法可以返回下乙個有效的iterator,cont.erase(iter++)可以修改為cont.erase(iter)
list使用了不連續分配的記憶體,並且它的erase方法也會返回下乙個有效的iterator。
各個容器的erase(pos)實現:
vector
erase(pos),直接把pos+1到finish的資料拷貝到以pos為起點的區間上,也就是vector的長度會逐漸變短,同時iter會逐漸往後移動,直到iter == cont.end(),由於容器中end()返回的迭代器是最後乙個元素的下乙個(這個地方沒有任何值),現在考慮這個狀態前乙個狀態,此時要刪除的點是iter, tempit = iter, ++iter會指向此時的end(),但是執行erase(tempit)之後,end()向前移動了!!!問題來了,此時iter空了!!!不崩潰才怪。
list
erase(pos),幹的事情很簡單,刪除自己,前後的節點連線起來就完了,所以iter自增的過程不會指空,不會崩潰嘍。
map,
該容器底層實現是btree,刪除操作分了很多種情形來討論的,目的是為了維持紅黑樹性質。每個節點類似於list節點,都是單獨分配的空間,所以刪除乙個節點並不會對其他迭代器產生影響。
deque
deque是乙個雙向開口的連續線性空間,實質是分段連續的,由中控器map維持其整體連續的假象。它是雙向開口的,可以在頭部或尾部增加、刪除。
erase(pos),deque是這樣處理的:如果pos之前的元素個數比較少,那麼把start到pos-1的資料移到起始位址為start+1的區間內;否則把pos後面的資料移到起始位址為pos的區間內。在題中iter一直往後移動,總會出現後面資料比前面少的時候,這時候問題就和1一樣了,必須崩潰!
學習筆記 資料結構 線性結構和STL
棧是乙個先進後出的容器,需要使用 include標頭檔案 stack int a 定義乙個儲存int 型別的棧 a.push back 1 將 1 壓入棧中 a.pop 將棧的最後乙個元素彈出 刪除 a.empty 判斷棧是否為空,如果是空的返回1 否則返回0 a.size 返回棧的大小 a.top...
STL學習筆記1 vector
c stl standard template library 標準模板庫是通用類模板和演算法的集合。包含一些標準的資料結構的實現如queues 佇列 lists 鍊錶 stacks 棧 等。stl提供了以下三類資料結構的實現 標準容器類 順序性容器 vector 從後面快速插入和刪除,直接訪問任何...
機器學習筆記1 線性回歸
資料探勘 人工智慧等領域中存在兩個 分類和回歸 先說回歸 一些簡單的數學題,求解問題往往通過求解未知數,也就是 通過給定的自變數和函式,通過函式求解得到未知數。而機器學習是,通過給定的自變數和函式的解,去求解函式。即求解function x y。通過樣本中大量的特徵 x 和目標變數 y 求得這個函式...