【问题标题】:Why doesn't the queue data structure support random access为什么队列数据结构不支持随机访问
【发布时间】:2016-12-11 17:28:07
【问题描述】:

阅读An Extensive Examination of Data Structures Using C# 2.0后,我了解到C#中的队列有一个内部数组,其中队列的元素按顺序存储,一个开始索引和一个结束索引。我不明白为什么您不应该能够读取或写入第 n 个元素。您所要做的就是return array[(n + start) % array.Length]。当然,如果 n 在范围内。
这有时会很有用。

【问题讨论】:

  • 因为 Queue 不是为此创建的。
  • 我想有时读取第 n 个元素可能很有用。但是,如果您可以写入它,那么它只是一个数组或列表。但是,您依赖于实现细节。并非所有语言的所有队列都实现为数组。随机访问不是队列哲学的一部分。换句话说:如果它有随机访问,它就不会是一个队列。
  • 被请求并被拒绝:github.com/dotnet/corefx/issues/4961
  • queue 遵循先进先出原则,因此您不能访问 'n' 处的元素,除非在 n-1 个元素出队之前,队列用于特殊目的。使用简单的数组。
  • @lok​​esh1729 如果要删除前面的项目,简单数组的性能会更差。所以我可能会编写自己的随机访问队列数据结构。

标签: c# data-structures queue


【解决方案1】:

你可以使用ElementAt读取第n个元素:

var element = q.ElementAt(index);

既然是IEnumerable扩展方法,就得加上using System.Linq;

但是,您不能编写第 n 个元素,因为这不是 Queue 的用途。那只会破坏队列中最重要的特性,即先进先出。如果您可以在某个索引处插入项目,那么首先使用队列是没有意义的。

【讨论】:

  • 我不是在谈论插入项目。但实际上,插入项目的选项会首先破坏使用队列的意义吗?我承认队列的部分要点是保留了项目的顺序。但另一部分是您可以在恒定时间内在数据结构的两端添加和删除项目。
  • @NounVerber 这不是队列。您要么需要创建自己的数据结构。或者使用灵活的可用列表之一。 写第n个元素是什么意思?
  • 写第n个元素是什么意思?我的意思是,在这种情况下,用不同的项目替换它。所以如果那里有 2,我可以把 5 放在那里。
  • @NounVerber 您可以通过使用ElementAt 检索对象来更新第n 个元素的对象的属性。但是你不能替换它。那不是队列。我认为你不应该在你的情况下使用队列。
猜你喜欢
  • 2015-09-17
  • 2013-02-22
  • 1970-01-01
  • 2020-08-10
  • 2011-01-27
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多