我几乎可以肯定这应该是重复的,但我搜索了一段时间,却找不到答案。我应该在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 :(得分:18)
没有内置的Deque容器,但有几种可用的实现。
这是a good one from Stephen Cleary。这提供了O(1)操作来索引,也可以在开头插入并在末尾追加。
与Vector相当的C#是List<T>
。索引访问是O(1),但插入或删除是O(N)(除了最后插入,即O(1))。
答案 1 :(得分:9)
对于C#vector
,一个好的候选人是System.Collection.Generic.List
,正如其他人所提到的那样
C ++中最接近双端队列的是System.Collection.Generic.LinkedList
,这是一个双向链表。
答案 2 :(得分:3)
考虑System.Collections.Generic.List
和其他来自System.Collection.Generic
的{{1}},它们与C++
等价物具有相同的目的。
此外,您可能还有更多容器。看here。
答案 3 :(得分:1)
Deque不在C#中,但是我们可以通过Vector和List归档功能,下面是一个通过List归档Deque的示例程序。
using System;
using System.Collections.Generic;
public class GFG{
// Function to generate the array by
// inserting array elements one by one
// followed by reversing the array
static void generateArray(int []arr, int n)
{
// Doubly ended Queue
List<int> ans = new List<int>();
// Start adding functionality at both end
// Iterate over the array
// Even no at the front and odd no at the rear
for(int i = 0; i < n; i++)
{
// Push array elements
// alternately to the front
// and back
if (arr[i]%2==0)
ans.Insert(0,arr[i]);
else
ans.Add(arr[i]);
}
printDeque(ans);
// Output 8 6 4 2 6 5 1 3
// Start removing functionality at both end
// Let i want to remove first(8) and last(3) element from Deque
ans.RemoveAt(0);
printDeque(ans);
// Output 6 4 2 6 5 1 3
ans.RemoveAt(ans.Count-1);
printDeque(ans);
// Output 6 4 2 6 5 1
}
static void printDeque(List<int> q){
// Print the elements
// of the Deque
foreach(int x in q)
{
Console.Write(x + " ");
}
Console.WriteLine();
}
// Driver Code
public static void Main(String[] args)
{
int []arr = {5, 6, 1, 2, 3, 4,6, 8 };
int n = arr.Length;
generateArray(arr, n);
}
}
答案 4 :(得分:0)
尽管您无法执行索引操作,但是链表可能是在恒定时间内最先实现出队和最后出队的最接近的人之一。