以前一直用的mfc相關的內庫,最近發現在**實現時用stl相關的庫更好用,也更易移植,但是有些問題要問題,比如list的用法中,如果希望在遍歷的時候同時刪除掉一些元素,必須要注意iterator的移動方式。下面的例子給出了很好的說明。
stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器(如:vector 、deque);另一類是以不連續的節點形式儲存的容器(如:list、set、map)。在使用erase方法來刪除元素時,需要注意一些問題。
在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用:
正確使用方法1 std::list< int> list;
std::list< int>::iterator itlist;
for( itlist = list.begin(); itlist != list.end(); )
else
itlist++; }
或正確使用方法2 std::list< int> list;
std::list< int>::iterator itlist;
for( itlist = list.begin(); itlist != list.end(); )
else
itlist++; }
下面是兩個錯誤的使用方法:
錯誤使用方法1 std::list< int> list;
std::list< int>::iterator itlist;
for( itlist = list.begin(); itlist != list.end(); itlist++)
} 或錯誤使用方法2 std::list< int> list;
std::list< int>::iterator itlist;
for( itlist = list.begin(); itlist != list.end(); )
else
itlist++; }
正確使用方法1:通過erase方法的返回值來獲取下乙個元素的位置
正確使用方法2:在呼叫erase方法之前先使用 「++」來獲取下乙個元素的位置
錯誤使用方法1:在呼叫erase方法之後使用「++」來獲取下乙個元素的位置,由於在呼叫erase方法以後,該元素的位置已經被刪除,如果在根據這個舊的位置來獲取下乙個位置,則會出現異常。
錯誤使用方法2:同上。
這裡「++」運算子與我們平常的理解剛好相反,erase( itlist++) 是先獲取下乙個元素的位置在刪除; erase( ++itlist) 是刪除以後再獲取下乙個元素的位置。
在使用 vector、deque遍歷刪除元素時,也可以通過erase的返回值來獲取下乙個元素的位置:
正確使用方法 std::vector< int> vec;
std::vector< int>::iterator itvec;
for( itvec = vec.begin(); itvec != vec.end(); )
else
itlist++; }
注意:vector、deque 不能像上面的「正確使用方法2」的辦法來遍歷刪除。
STL之四 list用法詳解
相對於vector容器的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質 插入操作和刪除操作都不會造成原有的list迭代器失效,每次插入或刪除乙個元素就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list永遠是常數時間。常用函式 listc 建立乙個空的list listc...
STL學習之七 list用法示例
本文介紹stl中的list的用法示例。下面是list的知識點 1 list 是乙個雙向鍊錶容器 可以高效的進行插入與刪除 不可以隨機儲存元素 不支援at.pos 函式和操作符 2 list 的迭代器 可以 但不可以 it 3 3 list 結點序號從0號位置開始 4 list 的插入 當指標指向 插...
STL中list的用法
語法 void assign input iterator start,input iterator end void assign size type num,const type val assign 函式以迭代器start和end指示的範圍為list賦值或者為list賦值num個以val為值的...