SET LIST 等向迭代器转换时,迭代器时指向的引用

原创 2007年09月12日 19:39:00

前段时间做指标的修改时,遇到了一个问题:如果原指标中存在,现在要修改这个指标,将其删掉,会出先一个异常.有时可以删掉其中的一个,有时一个也删除不了.经过别人的指引,终于解决了,现在将一个问题写下来.

 源程序:

PO中存放的时原指标.VO 中存放的时新指标.将PO VO 进行对比,由此决定操作

 

//branch 1: 删除PO中存在,VO中不存在的指标
    
    for (Iterator i=indPOSet.iterator();i.hasNext();) {
     mpiPO = (MarketPlanIndicatorPO)i.next();
     isExist = false;
     for (Iterator i2=indVOSet.iterator();i2.hasNext();) {
      mpiVO = (MarketPlanIndicatorVO)i2.next();
      if (null != mpiVO.getIndicatorId() && mpiVO.getIndicatorId().longValue() == mpiPO.getIndicatorId().longValue()) {
       isExist = true;
       break;
      }
     }
     if (isExist) {
      //如果指标还存在,更新指标
      ObjectTranslate.transVO2PO(mpiVO,mpiPO);
     } else {
      //如果指标不存在,删除指标
      indPOSet.remove(mpiPO);
     }
    } 

 问题在于indVOSet里的数据经过iterator()操作后Iterator i2只是存放indVOSe的一个引用,同理,indPOSet也是.这样当我们在删除mpiPO时,只是删除了迭代器i的一个引用,并没有真正的删除一个指标.当进行下一轮的比较时.删除引用的部位是指向一个空引用,因此会抛出一个异常.为了解决这个问题,就要防止空应用的比较.为此该用数据比较,而不是迭代器

修改后的源代码:

  //branch 1: 删除PO中存在,VO中不存在的指标
    MarketPlanIndicatorPO[] mpiPOArray = (MarketPlanIndicatorPO[])indPOSet.toArray(new MarketPlanIndicatorPO[0]);
    for (int i=0;i<mpiPOArray.length;i++) {
     mpiPO = (MarketPlanIndicatorPO)mpiPOArray[i];
     isExist = false;
     for (Iterator i2=indVOSet.iterator();i2.hasNext();) {
      mpiVO = (MarketPlanIndicatorVO)i2.next();
      if (null != mpiVO.getIndicatorId() && mpiVO.getIndicatorId().longValue() == mpiPO.getIndicatorId().longValue()) {
       isExist = true;
       break;
      }
     }
     if (isExist) {
      //如果指标还存在,更新指标
      ObjectTranslate.transVO2PO(mpiVO,mpiPO);
     } else {
      //如果指标不存在,删除指标
      indPOSet.remove(mpiPO);
     }
    }

迭代器失效的几种情况总结

1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删...
  • lujiandong1
  • lujiandong1
  • 2015年11月16日 22:11
  • 3322

List的迭代器

引自"C++ primer plus 6"中的话: 理解迭代器是理解STL的关键所在。 模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。 因此,它们都是STL通用方法的重要...
  • Since20140504
  • Since20140504
  • 2014年10月29日 15:29
  • 2384

【C++】vector容器和list容器中使用单个迭代器的erase函数学习笔记

例题为:假设有如下ia的定义,ia复制到vector和list中,把list容器中奇数值元素删除掉,把vector容器偶数值元素删除掉。 数组复制采用push_back操作。删除操作采用了erase函...
  • qazcxh
  • qazcxh
  • 2015年04月11日 16:07
  • 1231

c++迭代器的使用与简介

c++迭代器的使用与简介     除了使用下标来访问vector对象的元素外,标准库还提供了另一种检测元素的方法:使用迭代器(iterator)。迭代器是一种允许程序员检查容器内...
  • u012547790
  • u012547790
  • 2014年05月05日 16:08
  • 1944

python中使用迭代器 Iterator

迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能回退,只能往前进行迭代。这并不是什么很大的缺点,因为人们几乎不需要在迭代途中进行回退...
  • Winterto1990
  • Winterto1990
  • 2015年08月10日 15:10
  • 3061

STL 反向迭代器(rbegin,rend)

#include #include using namespace std; int main() { sets; s.insert(1); cout>>>>点击打开链接 ...
  • qq_24489717
  • qq_24489717
  • 2015年12月18日 11:14
  • 986

List集合特有的迭代器,ListIterator

List集合特有的迭代器,ListIterator是Iterator的子接口 /** * @author gaobin *什么是迭代器呢? *其实就是集合的取出方式 *如同抓娃娃游戏机中的夹...
  • cool__007
  • cool__007
  • 2017年02月11日 16:32
  • 732

用迭代器实现list的各种功能

#include #include #include #include using namespace std; template struct _ListNode { _ListNode* _p...
  • qingcunsuiyue
  • qingcunsuiyue
  • 2016年10月11日 15:46
  • 558

Qt的容器类之容器,迭代器

此文乃《Qt中的C++技术》的读书笔记。若喜欢,请支持图书作者。QT中的容器被分为两个大类:容器元素是一个值的,比如QVector,以及容器元素是一个(key, value)对的,比如QMap。...
  • kanchuan1905
  • kanchuan1905
  • 2016年12月13日 13:55
  • 703

java集合之列表迭代器ListIterator

在操作集合时,常常使用数组和动态的ArrayList(数组列表,因为ArrayList的底层实现是通过数组来实现的)类,但是,数组和数组列表在操作的时候有一个重大缺陷,如:在数组中删除一个元素时,当元...
  • Calvex880714
  • Calvex880714
  • 2014年11月08日 09:09
  • 4951
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SET LIST 等向迭代器转换时,迭代器时指向的引用
举报原因:
原因补充:

(最多只允许输入30个字)