【问题标题】:Which is the better way to delete an array member?删除数组成员的更好方法是什么?
【发布时间】:2017-10-05 22:19:57
【问题描述】:

我正在学习 OOP,所以我必须与数组进行交互,而不是与链表交互。我已经对数据进行了排序。问题是删除数组的一个成员(我们称之为DL)。我想出的第一种方法是从DL的索引处将i+1处的数据覆盖到i,并将读取量减少1。后来我发现我可以将DL与最后一个交换成员然后将计数变量减少 1。但是,我将不得不再次对数据进行排序。那么哪个更好呢?

【问题讨论】:

  • 阵列有多大?它们里面有什么样的数据?它可以被memcpy'd吗?您是否考虑过同时尝试和分析?
  • 我非常厌倦这种对似乎不需要的帖子的随机投票。他问了一个完全正确的问题,没有必要被欺负。
  • 我的错,Trung,我意识到(迟来的)可能是“学习”让你打折链接列表,而不是“OOP”中固有的东西 - 删除了我的评论。
  • 当您说数组时,您是指“原始”C 样式数组、std::vector 还是 std::array?还要定义“更好”,更好的执行速度,更好的可读性,最佳 OOP 实践,什么?
  • @joe_04_04 否决票可能不像您想象的那么随机,请参阅Are questions asking for “The best way” always primarily opinion-based?。这个问题没有指定“什么是最好的”标准,所以需要澄清一下。

标签: c++ arrays oop


【解决方案1】:

如果它需要保持排序,我会说最好通过将目标后面的每个元素移回一个来覆盖它。将其与 end 元素交换,然后再使用将需要更多的工作,因为交换需要三个操作:

1) 将元素一复制到临时变量。 2) 将元素二复制到元素一。 3) 将临时元素复制到元素二。

这需要在排序算法中重复多次。而且,如果您正在处理一个结构或类的对象数组,每个对象具有多个私有数据成员,工作量就会增加更多。

覆盖每次迭代需要更少的移动:

1) 将i + 1 复制到i

所以,我肯定会使用覆盖,将所有元素移回一位并将计数减一。

无论如何,最好使用您的特定数据集对两者进行计时,然后看看哪个更快。通过计算实施开始和结束之间的毫秒数,这非常简单。

【讨论】:

    【解决方案2】:

    “更好”是一个非常主观的术语,哪个更合适(无论您选择什么定义)很大程度上取决于您所谈论的数据集类型(大小等)。

    但我要提一下,数组 shuffle 和大多数“常规”排序的相对时间复杂度分别是 O(n)O(n log n)

    这意味着在绝大多数情况下,洗牌可能会更快。

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 2021-07-14
      • 2011-12-04
      • 2020-11-17
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      相关资源
      最近更新 更多