先看兩條規制:1,對于節點式容器(map, list, set)元素的刪除,插入操作會導致指向該元素的迭代器失效,其他元素迭代器不受影響2,對于順序式容器(vector)元素的刪除、插入操作會導致指向該元素以及后面的元素的迭代器失效常見的錯誤代碼示例:
1struct sMem 2{ 3 int m_i; 4 sMem(int i = 10) 5 { 6 m_i = i; 7 } 8 9 int GetI()10 {11 return m_i;12 }13};
12typedef vector<sMem*> sMemList;3typedef vector<sMem*>::iterator sIT;4sMemList MemList;
1 // 迭代器失效 2 for (sIT it = MemList.begin(); it != MemList.end(); ++it) 3 { 4 if ((*it)->GetI() == 10) 5 MemList.erase(it); 6 else 7 { 8 printf("%d:%d\n", i++, (*it)->GetI()); 9 }10 }
兩種解決方法:對于順序容器:
bool Equal10(sMem* pMem){
return pMem->GetI() == 10 ? true : false;}
1MemList.erase(remove_if(MemList.begin(), MemList.end(), Equal10));
對于結點容器:
1 for (sIT it = MemList.begin(); 2 it != MemList.end(); ) 3 { 4 if ((*it).second->GetI() == 10) 5 MemList.erase(it++); 6 else 7 { 8 printf("%d:%d\n", i++, (*it).second->GetI()); 9 it++;10 }11 }
posted on 2009-07-09 14:48 肥仔 閱讀(1564) 評論(0) 編輯 收藏 引用 所屬分類: Boost & STL
Powered by: C++博客 Copyright © 肥仔