// for vector, deque
template <class Container, class T>
inline
void vector_erase(Container & c, T const& t)
{
c.erase(std::remove(c.begin(), c.end(), t), c.end());
}
template <class Container, class Pred>
inline
void vector_erase_if(Container & c, Pred pred)
{
c.erase(std::remove_if(c.begin(), c.end(), pred), c.end());
}
// for list, set, map
template <class Container, class T>
void list_erase(Container & c, T const& t)
{
typename Container::iterator
b = c.begin(), e = c.end(), prev = b;
while (b != e)
{
++b;
if (*prev == t) c.erase(prev);
prev = b;
}
}
template <class Container, class Pred>
void list_erase_if(Container & c, Pred pred)
{
typename Container::iterator
b = c.begin(), e = c.end(), prev = b;
while (b != e)
{
++b;
if (pred(*prev)) c.erase(prev);
prev = b;
}
}
# re: [STL] 循環中erase 回復 更多評論
2006-12-28 09:41 by
@eXile
如果需要打印出被刪除的元素呢?
對于list,如果只要刪除某個項,調用list.remove就可以了
# re: [STL] 循環中erase 回復 更多評論
2006-12-28 12:22 by
1)打印出被刪除的元素, 很簡單
struct MyPred
{
bool operator()(int n) const
{
if(n%2 == 0) {cout << "Erasing " << n << endl; return true; }
else return false;
}
};
vector<int> v;
vector_erase_if(v, MyPred());
2)list提供了remove方法,但是set,map沒有
(實際上這幾行代碼都是從STL的list源碼中抄出來的,主要用于set 和map);
# re: [STL] 循環中erase 回復 更多評論
2007-02-14 15:49 by
方法2是錯的!應該是(ri++).base().
給出的循環刪除方法太低效!
# re: [STL] 循環中erase 回復 更多評論
2012-10-25 20:33 by
@楚竹荷葉
我也發現了,vector如果只有一個值,逆向刪除就會拋出異常,正向刪除不會