IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

从数组里删除一个元素

云风的 BLOG 2010-08-31 20:20:43 累计浏览 2,335 次
本机暂存

去年介绍过我在项目中实现的一个动态数组模块的接口

实际上,我为它提供的接口要更多一些,比如删除一个元素。

  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 方法,就不太讨人喜爱了。

同分类推荐文章

  1. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. python编程细节──遍历dict的两种方法比较 (累计阅读 20,371)
  2. 无锁消息队列 (累计阅读 14,276)
  3. Linus:利用二级指针删除单向链表 (累计阅读 13,251)
  4. Key-Value小数据库tmdb发布:原理和实现 (累计阅读 8,352)
  5. 一些有意思的算法代码 (累计阅读 5,156)
  6. scala入门手记 (累计阅读 4,773)
  7. xml转数组的方法 (累计阅读 4,670)
  8. 数据映射–平衡二叉有序树 (累计阅读 4,575)
  9. 实时排名,其实很简单 (累计阅读 4,508)
  10. javascript扩展Array(数组)类 (累计阅读 4,191)