2013-03-24 243 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