stl容器分為sequence container(vector, deque, list)和associative container(set, multiset, map, multimap)。 c++標準中, sequence container的erase函式會返回iterator, 但是associative container卻不會返回。 visual studio中實現了,但是在gcc下卻不能編譯通過,所以為了解決相容問題,在gcc需要寫成a.erase(b++)
如果容器是乙個標準序列容器,則寫乙個迴圈來遍歷容器中的元素,
記住每次掉用erase時,要用它的返回值更新迭代器。
如果容器是乙個標準關聯容器,則寫乙個迴圈來遍歷容器中的元素,
記住每次把迭代器傳給erase時,要對迭代器做字尾遞增。
1. 如果容器是
vector、string或deque
,則使用
erase-remove/remove_if
習慣用法。注意需要使用標頭檔案
, 否則編譯不會通過
seqcontainerc;
c.erase(remove(c.begin(),c.end(),1963),c.end());
只有通過這種方式才能使得迭代器恢復正常,不影響下次使用
2. 如果容器是
list
,則使用
list::remove/list::remove_if
list_.remove_if(條件)
push_back, remove
eg1: remove_if
typedef std::listnode_relation_list;
typedef std::list::iterator node_relation_list_iterator;
class nodecompare
bool operator()(const noderelation &rel)
private:
int id_;
int node_id_;
};node_relation_list nodelist_;
nodelist_.remove_if(nodecompare(id,nodeid));
記得有時候在使用list等容器的時候需要使用list.clear()確保這個list開始是處於空的狀態
eg 2: std::listlist;
int a= 1;
list remove(a);
3. map刪除某個迭代器,
timer_map_.insert(timervaluetype(timer_type, timer_sys_id));//only add id which is not -1
erase()
typedef std::maptimer_map;
typedef timer_map::value_type timervaluetype;
void stopalltimer()
else
}return ;
4.需要用const_iterator記錄迭代器輪詢到的乙個問題,下次僅僅輪詢到這個位置。
vectorlist1;
typedef vector::iterator list_iter;
typedef vector::const_iterator list_iter_const;
list_iter_const iter_rec;
for(int i=0; i < 10; i ++)
for(list_iter iter = list1.begin(); iter != list1.end(); iter++) }
list_iter iter1 = list1.begin();
//iter i(d.begin());//使i指向d的起始位置
//advance(iter_rec,distance(iter1,iter_rec));
for(; iter1 != iter_rec; iter1++)
{ if(*iter1 == 3)
{ cout<<"find 3"advance(itercopy,distance(list1.begin(),iter_rec));
cout<<"itercopy's value"<<*itercopy<
itercopy必須賦初值,將他移到const_rec所值的迭代器, 最後得到位置為5的iterator
STL刪除迭代器
1.關聯容器刪除乙個迭代器對其他迭代器不會造成影響,返回的是void型。2.序列容器刪除乙個迭代器後會造成後面的所有迭代器都往前移動乙個位置,因此先前儲存的迭代器都會失效,返回的是被刪除後新複製到被刪除位置的元素的迭代器。c 中利用迭代器刪除元素會發生什麼?1 對於關聯容器 如map,set,mul...
C 中容器迭代器刪除失效問題
c 迭代器失效問題 map set等關聯容器如何刪除元素 vector list deque等序列容器如何刪除元素 迭代器如何使用 序列性容器 vector和list和deque erase迭代器不僅使所指向被刪元素的迭代器失效,而且使被刪元素之後的所有迭代器失效,所以不能使用erase iter ...
迭代器的刪除問題
it m ballactionsmgr.begin for it m ballactionsmgr.end it 這樣刪除是正確的 it m ballactionsmgr.begin for it m ballactionsmgr.end it 這樣刪除有問題,刪除迭代器以後,迭代器又加了1,所以刪...