2013-03-24 43 views
18

我几乎肯定这应该是重复的,但我搜索了一段时间,找不到答案。我应该在C#中使用什么来替代C++向量,并高效地使用。那就是我需要一种能够高效支持直接索引的结构,并且还能以有效的方式再次支持从一端或两端删除(取决于向量或deque案例)。c#相当于C++ vector或deque

在java中,我通常使用ArrayList至少为矢量,但对于C#我发现this source指出: ArrayList resizes dynamically. As elements are added, it grows in capacity to accommodate them. It is most often used in older C# programs.。那么做这件事的新方法是什么?再次,我该如何处理deque案件?

+0

一个选项是https://github.com/dcastro/DequeNET – 2018-01-08 16:50:45

回答

16

没有内置的Deque容器,但有几种实现可用。

这是a good one from Stephen Cleary。这提供了O(1)操作来索引,也可以在开始时插入并在结尾处追加。

相当于Vector的C#是List<T>。索引访问是O(1),但插入或删除是O(N)(除了在末尾插入,即O(1))。

+0

'List'中的索引操作有多高效?我认为它只是遍历列表 – 2013-03-24 13:45:47

+4

@IvayloStrandjev它不是一个双向链表,它是一个向量。 – wRAR 2013-03-24 13:47:35

+0

@Ivaylo:不,它不是链表,它是一个数组的包装,因此索引只是使用索引直接访问底层数组,所以这是一个O(1)操作。 (几乎与C++矢量相同) – 2013-03-24 13:47:41

3

考虑System.Collections.Generic.List和其他System.Collection.Generic它们的作用与它们的C++相同。
此外,可能有更多的容器给你。看看here

+0

'泛型',而不是'泛型' – wRAR 2013-03-24 13:43:07

+0

@wRAR太真了!谢谢,我总是混合起来 – 2013-03-24 13:43:57

+1

它是Deque还是Dequeue?我似乎无法找到有关Deque的任何信息。不是我downvote顺便说一句。 – 2013-03-24 13:44:57

8

对于C#vector,其他人提到的优秀候选人是System.Collection.Generic.List
离C++最接近的deque是System.Collection.Generic.LinkedList这是一个双向链表。

+4

+1,如果您不需要访问中间的元素,则链接列表看起来像是最好的deque解决方案。 – DCShannon 2015-07-02 18:03:06

+3

推荐'LinkedList'作为'deque'替换是不正确和不准确的。它们是完全不同的野兽(前者没有连续分配),并且绝对不可替代。 – 2017-06-23 02:53:34