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)如果容器是vectorstringdeque,使用erase-remove惯用法,例如

c.erase(remove(c.begin(), c.end(), 1963),c.end());

 

2)如果容器是list,使用list.remove

// clist时,remove成员函数是去除特定值的元素的最佳方法

c.remove(1963);

 

3)如果容器是标准关联容器,使用它的erase成员函数,例如:

// c是标准关联容器时,erase成员函数是去除特定值的元素的最佳方法

c.erase(1963);

 

3.去除一个容器中满足一个特定判定式所有对象

 bool badValue(int x);   // 函数定义:返回x是否是“bad

o     如果容器是vectorstringdeque,使用erase-remove_if惯用法:

// cvectorstringdeque时这是去掉badValue返回真的对象的最佳方法

c.erase(remove_if(c.begin(), c.end(), badValue),c.end());

o     如果容器是list,使用list.remove_if

// clist时这是去掉badValue返回真的对象的最佳方法

c.remove_if(badValue);

o     如果容器是标准关联容器,使用remove_copy_ifswap

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 妙哉)

 

posted on 2011-05-31 18:02  maxweii  阅读(413)  评论(0编辑  收藏  举报