STL常用技巧.

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

 

转载于:https://www.cnblogs.com/weiqubo/archive/2011/05/31/2064955.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值