31

これは重複しているはずだとほぼ確信していますが、しばらく検索したところ、答えが見つかりませんでした。C ++ベクトルを置き換えて効率的に両端キューを作成するには、C#で何を使用する必要がありますか。つまり、直接インデックス付けを効率的にサポートし、一方または両方の端からの削除(ベクトルまたは両端キューの場合に応じて)を効率的にサポートする構造が必要です。

Javaでは、通常、少なくともvectorにはArrayListを使用しますが、C#には、次のようなソースが 見つかりましたArrayList resizes dynamically. As elements are added, it grows in capacity to accommodate them. It is most often used in older C# programs.。では、これを行うための新しい方法は何ですか?また、両端キューの場合はどうすればよいですか?

4

6 に答える 6

22

組み込みのDequeコンテナはありませんが、いくつかの実装が利用可能です。

これがStephenClearyの良いものです。これにより、インデックスを作成し、最初に挿入して最後に追加するO(1)操作が提供されます。

Vectorに相当するC#はList<T>です。インデックス付きアクセスはO(1)ですが、挿入または削除はO(N)です(最後に挿入するO(1)を除く)。

于 2013-03-24T13:43:51.650 に答える
11

C#の場合、他の人が述べたようvectorに、良い候補ですSystem.Collection.Generic.List
C ++の両端キューに最も近いのSystem.Collection.Generic.LinkedListは、二重にリンクされたリストです。

于 2014-11-28T17:37:06.203 に答える
3

それらからの考慮System.Collections.Generic.Listおよび他はSystem.Collection.GenericそれらのC++同等物と同じ目的を果たします。
さらに、より多くのコンテナがあるかもしれません。ここを見てください。

于 2013-03-24T13:42:37.990 に答える
1

DequeはC#にはありませんが、VectorとListで機能をアーカイブできます。以下は、DequeをListでアーカイブするためのサンプルプログラムです。

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);
}
}
于 2020-10-07T03:22:43.127 に答える
0

インデックス操作を実行することはできませんが、linkedlistは、デキューを最初に実装し、一定時間で最後にデキューを実装するのにおそらく最も近いものの1つです。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.linkedlist-1.removefirst?view=netframework-4.8

于 2020-03-09T05:38:48.713 に答える
0

私にとっては、これらの単純な拡張方法で十分でした。

using System.Linq;
using System.Collections.Generic;
-----
-----


        public static T consume<T>(this List<T> list, int index) {
            if (list.Count < index) return default(T);
            var item = list[index];
            list.RemoveAt(index);
            return item;
        }
        public static T pop<T>(this List<T> list) {
            return list.consume(list.Count - 1);
        }
        public static T dequeue<T>(this List<T> list) {
            return list.consume(0);
        }
        public static void push<T>(this List<T> list, T item) {
            list.Add(item);
        }
        public static void enqueue<T>(this List<T> list, T item) {
            list.Add(item);
        }
于 2022-02-09T21:30:42.443 に答える