免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7335 | 回复: 7
打印 上一主题 下一主题

[C++] map 的删除的却别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-07 11:08 |只看该作者 |倒序浏览
循环删除map

std::map<int , char *>::iterator its;
        for(its = tt_map.begin(); its != tt_map.end(); its++)
        {
            tt_map.erase(its->first);
            std::cout<<"tt_map.size() = "<<tt_map.size()<<std::endl;
        }



std::map<int , char *>::iterator its;
        for(its = tt_map.begin(); its != tt_map.end(); its++)
        {
            tt_map.erase(its);
            std::cout<<"tt_map.size() = "<<tt_map.size()<<std::endl;
        }

有什么却别吗....

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2007-11-07 11:18 |只看该作者
std::map<int , char *>::iterator its;
for(its = tt_map.begin(); its != tt_map.end(); its++)
{
      tt_map.erase(its);
      std::cout<<"tt_map.size() = "<<tt_map.size()<<std::endl;
}


我觉得这个比较好!

论坛徽章:
0
3 [报告]
发表于 2007-11-07 11:20 |只看该作者
不知道你要问什么?

tt_map.clear();

tt_map.erase(tt_map.begin(), tt_map.end());

论坛徽章:
0
4 [报告]
发表于 2007-11-07 11:35 |只看该作者
我发现
std::map<int , char *>::iterator its;
        for(its = tt_map.begin(); its != tt_map.end(); its++)
        {
            tt_map.erase(its);
            std::cout<<"tt_map.size() = "<<tt_map.size()<<std::endl;
        }

这样删除的话内存不会被释放.....

tt_map.erase(its-first)删除的话内存会被释放....

论坛徽章:
0
5 [报告]
发表于 2007-11-07 13:24 |只看该作者
不知道想做什么
tt_map.erase(its); 后 its 已经失效了。

论坛徽章:
0
6 [报告]
发表于 2007-11-07 13:44 |只看该作者
不用内部的迭代,自己还实现一把迭代

论坛徽章:
0
7 [报告]
发表于 2007-11-07 21:39 |只看该作者
如 zlbruce 所说,如果 iterator 指向的对象被删除了,再使用它的结果是未定义的。

tt_map.erase(its->first)  和 tt_map.erase(its) 完成的是同样功能,在这里的区别是执行效率。可查找相关文档了解它们的区别。

论坛徽章:
0
8 [报告]
发表于 2007-11-07 21:48 |只看该作者
请看《Effective STL》

● 去除一个容器中有特定值的所有对象:
如果容器是vector、string或deque,使用erase-remove惯用法。
如果容器是list,使用list::remove。
如果容器是标准关联容器,使用它的erase成员函数。
● 去除一个容器中满足一个特定判定式的所有对象:
如果容器是vector、string或deque,使用erase-remove_if惯用法。
如果容器是list,使用list::remove_if。
如果容器是标准关联容器,使用remove_copy_if和swap,或写一个循环来遍历容器元素,当你把迭代
器传给erase时记得后置递增它。
● 在循环内做某些事情(除了删除对象之外):
如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它的返回值更新你
的迭代器。
如果容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP