stl疑问一:关于,vector的erese(it)的启示

实例:

class A
{
//略
public:
void SetValueItem(long lValue)
{
DATA_IT it = m_data.begin();
for(; it != m_data.end(); it++)
{
if((*it)%lValue == lValue)
{
m_data.erase(it); 如果这样,由于erase(it) 会使it 空指向,导致程序就有可能报错,
}
}
}

private:
typedef  std::vector<long>  DATA,*PDATA
typedef  std::vector<long>::iterator  DATA_IT;

DATA  m_data;
};



对于这种比较低级的错误,如果要修改是不是会感觉有点儿麻烦:

方法1: 用个临时迭代器 来保存要去除的迭代器; 

方法2:去修改it = m_data.erase(it);

方法3: 直接用stl 的api  remove_if,我个人比较认可这种方法;

实现:

template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!pred(*first)) {
      *result = *first;
      ++result;
    }
    ++first;
  }
  return result;
}

用法:
#include <iostream>     // std::cout
#include <algorithm>    // std::remove_if


bool IsOdd (int i) { return ((i%2)==1); } 

int main () {
  int myints[] = {1,2,3,4,5,6,7,8,9};            // 1 2 3 4 5 6 7 8 9

  // bounds of range:
  int* pbegin = myints;                          // ^
  int* pend = myints+sizeof(myints)/sizeof(int); // ^                 ^

  pend = std::remove_if (pbegin, pend, IsOdd);   // 2 4 6 8 ? ? ? ? ?
                                                 // ^       ^
  std::cout << "the range contains:";
  for (int* p=pbegin; p!=pend; ++p)
    std::cout << ' ' << *p;
  std::cout << '\n';

  return 0;
}

个人感受:这个bug 让我感觉到,个人的想法是有限的,对于一些基本的操作最好使用别人已经验证好的api,这样可以减少你的开发时间,提高效率。
可以用这些时间来考虑需求本身及程序结构的问题。看来,以后尽量站在巨人的肩上,让自己看的更远一些。
 
最近,我正在做c++资源管理的东西,但还有几点儿没想明白,到时候整理完了,麻烦各位指点指点。
好了,该说的都说完了,求喷!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值