Effective STL--不同容器删除特定元素的方法

 输入迭代器是每个迭代位置智能被读一次的只读迭代器。输出迭代器是每个迭代位置只能被写一次的只写迭代器。输入和输出迭代器被塑造为读和写输入和输出流。前向迭代器有输入和输出迭代器的能力,但是他们可以反复读或写一个位置。它们不支持operator--,所以他们可以高效地向前移动任意次数。所有的标准STL容器都支持比前向迭代器更强大的迭代器。散列容器是前向迭代器,单链表容器也提供前向迭代器

 

双向迭代器就想前向迭代器,除了他们的后退尅像前进一样容易。标准关联容器都提供双向迭代器。List也有。

 

随机访问迭代器可以做双向迭代器做的一切事情,但他们也提供“迭代器算术”,有一步向前或向后跳的能力。Vector string deque都提供随机访问迭代器。指针数组的指针可以作为数组的随机访问迭代器。

 

对于deque迭代器失效的情况:

1、  在deque容器首部或者尾部插入元素不会使得任何迭代器失效。

2、  在其收不或尾部删除元素则只会使指向被删除元素的迭代器失效

3、  在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效

 

容器容纳了对象,但不是你给他们的那个对象。此外,当你从容器中获取一个对象时,你所得到的的对象不是容器里的那个对象。取而代之的是,当你想容器中添加一个对象,静茹容器的是你指定的对象的拷贝。

 

在容器中删除元素的分类情况:

 

1、去除一个容器总特定值的所有对象:

如果容器是vector string或deque,使用erase-remove惯用法

c.erase(remove(c.begin(),c.end(),1999),c.end());//当c时vectorstring deque时,erase-remove惯用法是去除特定值的元素

 

如果容器是list,使用list::remove

c.remove(1999); //当c时List时,remove成员函数是去除特定值的元素的最佳方法

 

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

c.erase(1999);//当c时标准关联容器时erase成员函数是去除特定值的元素的最佳方法

 

 

2、去除一个容器中满足一个特定判定式的所有对象:

如果容器是vector string或deque,使用erase-remove_if惯用法

c.rease(remove_if(c.begin(),c.end(),badvalue),c.end());//当c时vectorstring deque时这样是去掉badbale返回值为真的对象的最佳方法

 

如果容器是list 使用list::remove::if

c.remove_if(badvalue);//当c时list时这是去掉badvalue返回值为真的对象的最佳方法

 

如果容器是标准关联容器,使用remove_copy_if和swap,或写一个循环来遍历容器元素,当你吧迭代器传给erase时记得后置递增它

For(container<int>::iterator I =c.begin();i!=c.end();)

{

         If(badvalue(*i))c.erase(i++);

         Else++I;

}

//for循环的第三部分是空的,在下面自增

在循环内做某些事情(除了删除对象之外):

如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它的返回值更新你的迭代器

如果标准容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值