Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1463875
  • 博文数量: 218
  • 博客积分: 6394
  • 博客等级: 准将
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-08 15:33
个人简介

持之以恒

文章分类

全部博文(218)

文章存档

2013年(8)

2012年(2)

2011年(21)

2010年(55)

2009年(116)

2008年(16)

分类: C/C++

2013-02-04 18:23:50

参考effeective stl

在容器中删除元素
(A) 去除一个容器中有特定值的所有对象:    
    (1) 如果容器是vector、string或deque,使用erase-remove惯用法。
        例如:c.erase(remove(c.begin(), c.end(), 1963),c.end()); // 当c是vector、string的时候
    (2) 如果容器是list,使用list::remove。
    (3) 如果容器是标准关联容器,使用它的erase成员函数。
(B) 去除一个容器中满足一个特定判定式的所有对象:
    (1) 如果容器是vector、string或deque,使用erase-remove_if惯用法。
    (2) 如果容器是list,使用list::remove_if。
    (3) 如果容器是标准关联容器,使用remove_copy_if和swap,或写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。
(C) 在循环内做某些事情(除了删除对象之外): 
    (1) 如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它的返回值更新你的迭代器。
for (SeqContainer::iterator i = c.begin(); 
i != c.end();){
    if (badValue(*i)){
    logFile << "Erasing " << *i << '\n'; 
    i = c.erase(i); // 通过把erase的返回值
    } // 赋给i来保持i有效
    else
        ++i;
}
(2) 如果容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。


AssocContainer c;
for (AssocContainer::iterator i = c.begin(); // 循环条件和前面一样
i !=c.end();){
if (badValue(*i)){ 
logFile << "Erasing " << *i <<'\n'; // 写日志文件 
c.erase(i++); // 删除元素
}
else ++i;
}

阅读(1690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~