1
比如:vector vecID; 中保存了m个ID,这时要删除第n个ID。
遍历是一个方法;即vector::itertor it = vecID.begin(); 然后++it n次。
更好的方法是:vector::itertor it = vecID.begin() + n; vector的迭代器直接支持这种偏移。
然后用vecID.erase(it)方法 删除该元素。
2.去除一个容器中有特定值的所有对象
1)如果容器是vector、string或deque,使用erase-remove惯用法,例如
c.erase(remove(c.begin(), c.end(), 1963),c.end());
2)如果容器是list,使用list.remove
// 当c是list时,remove成员函数是去除特定值的元素的最佳方法
c.remove(1963);
3)如果容器是标准关联容器,使用它的erase成员函数,例如:
// 当c是标准关联容器时,erase成员函数是去除特定值的元素的最佳方法
c.erase(1963);
3.去除一个容器中满足一个特定判定式的所有对象
bool badValue(int x); // 函数定义:返回x是否是“bad”
o 如果容器是vector、string或deque,使用erase-remove_if惯用法:
// 当c是vector、string或deque时这是去掉badValue返回真的对象的最佳方法
c.erase(remove_if(c.begin(), c.end(), badValue),c.end());
o 如果容器是list,使用list.remove_if:
// 当c是list时这是去掉badValue返回真的对象的最佳方法
c.remove_if(badValue);
o 如果容器是标准关联容器,使用remove_copy_if和swap。
o 如果需要写一个循环遍历容器元素erase,注意iterator的递增逻辑
// 错误代码:当容器的一个元素被删时,指向那个元素的所有迭代器都失效了
AssocContainer<int> c;
// 不要这么做!
for (AssocContainer<int>::iterator i = c.begin(); i!= c.end(); ++i)
{
if (badValue(*i))
{
c.erase(i);
}
}
// 正确代码:
AssocContainer<int> c;
// for循环的第三部分是空的,i在后面自增。
for (AssocContainer<int>::iterator i = c.begin(); i != c.end();)
{
if (badValue(*i))
{
i = c.erase(i); //仅适用序列容器,关联容器用c.erase(i++); 因关联容器erase 返回void,
}
else
{
++i;
}
}(#add 妙哉)