从数组里删除一个元素
浏览:2172次 出处信息
去年介绍过我在项目中实现的一个动态数组模块的接口。
实际上,我为它提供的接口要更多一些,比如删除一个元素。
void array_erase(struct array *, seqi iter);
原来的语义就是删除 iter 引用的元素。但这里引出一个问题:删除后,iter 是否应该保持有效?
从语义上说,iter 应该在调用完毕后变成一个无效引用。但实际应用中,往往需要在迭代 array 的过程中,删除符合条件的元素。让迭代器失效的做法,用起来很不方便。
因为 array 其实是以一个双向队列的形式实现。以前我取了一个巧,删除这个操作实际上是把当前位置的元素和 array 头部的元素交换,然后将 array 头 pop 出去。
这样,iter 还是指向原地,只是指向的值是已经遍历过的元素。这样,循环则可以继续下去。
今天发现一个问题,如果 iter 一开始就指向头部。那么,在 pop 操作后,iter 还是被设置成无效了。这不是一个 bug ,但是实际效果非常讨厌。思考了一下,决定修改 array_erase 的定义。
array_erase 新的行为被定义成:删除 iter 引用的元素,并将 iter 向后移动。(如果已经到尾部,则变成空引用)
btw, C++ 在处理这个问题时, remove 算法不会做删除操作,而是把符合条件的元素交换到容器尾部,再调用 erase 方法真正删除。也是为了回避类似问题。不过我不太喜欢 remove/remove_if 那种用法。在函数式语言中,那很自然;但对函数式编程支持不足的 C++ 中,使用蹩脚的 template 方法,就不太讨人喜爱了。
建议继续学习:
- 为什么数组标号是从0开始的? (阅读:5995)
- C语言结构体里的成员数组和指针 (阅读:5886)
- 将数组定义为常量 (阅读:5428)
- Tips of Linux C programming (阅读:4905)
- xml转数组的方法 (阅读:4414)
- javascript扩展Array(数组)类 (阅读:3975)
- php数组排序 (阅读:3916)
- 一个 VLA (可变长度数组)的实现 (阅读:3955)
- 动态数组的 C 实现 (阅读:3897)
- javascript数组排序的问题 (阅读:3693)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Fastbit中的bitmap索引算法
后一篇:关于使用STL的红黑树map还是hashmap的问题 >>
文章信息
- 作者:云风的 BLOG 来源: 云风的 BLOG
- 标签: 数组
- 发布时间:2010-08-31 20:20:43
建议继续学习
近3天十大热文
-
[1258] WordPress插件开发 -- 在插件使用 -
[116] IOS安全–浅谈关于IOS加固的几种方法 -
[36] 读书笔记-壹百度:百度十年千倍的29条法则 -
[31] 关于IO的同步,异步,阻塞,非阻塞 -
[30] 页面停留时间和网站停留时间详解 -
[29] IP团伙行为分析(更新中文版报告) -
[28] Rax 系列教程(长列表) -
[28] iTerm2 (Mac Terminal) -
[26] 解决Ubuntu播放器快进问题 -
[25] 微博架构与平台安全演讲稿
