woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

关于stl 迭代器失效

先看两条规制:

1
,对于节点式容器(map, list, set)元素的删除,插入操作会导致指向该元素的迭代器失效,其他元素迭代器不受影响

2
,对于顺序式容器(vector)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效


常见的错误代码示例:

1clip_image001struct sMem
2clip_image002{
3clip_image003    int m_i;
4clip_image003    sMem(int i = 10)
5    clip_image002{
6clip_image003        m_i = i;
7clip_image004    }
8clip_image003
9clip_image003    int GetI()
10    clip_image002{
11clip_image003        return m_i;
12clip_image004    }
13clip_image005};

1clip_image001
2clip_image001typedef vector<sMem*> sMemList;
3clip_image001typedef vector<sMem*>::iterator sIT;
4clip_image001sMemList MemList;

1clip_image001    // 迭代器失效
2clip_image001    for (sIT it = MemList.begin(); it != MemList.end(); ++it)
3    clip_image002{
4clip_image003        if ((*it)->GetI() == 10)
5clip_image003            MemList.erase(it);
6clip_image003        else
7        clip_image002{
8clip_image003            printf("%d:%d\n", i++, (*it)->GetI());
9clip_image004        }
10clip_image005    }


两种解决方法:
对于顺序容器:

clip_image001
clip_image001
bool Equal10(sMem* pMem)
clip_image002{

    return pMem->GetI() == 10 ? true : false;
}

1clip_image001MemList.erase(remove_if(MemList.begin(), MemList.end(), Equal10));


对于结点容器:

1clip_image001    for (sIT it = MemList.begin();
2clip_image001        it != MemList.end(); )
3    clip_image002{
4        if ((*it).second->GetI() == 10)
5            MemList.erase(it++);
6        else
7        clip_image002{
8            printf("%d:%d\n", i++, (*it).second->GetI());
9            it++;
10        }
11    }

 

posted on 2009-07-09 14:48 肥仔 阅读(1399) 评论(0)  编辑 收藏 引用 所属分类: Boost & STL


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理