c#等价于c++的vector或deque

本文关键字:deque vector 等价于 c++ | 更新日期: 2023-09-27 18:05:37

我几乎可以肯定这应该是一个副本,但我搜索了一段时间,无法找到答案。我应该在c#中使用什么来有效地替换c++中的vector和deque ?也就是说,我需要一个结构,它既能有效地支持直接索引,又能以一种有效的方式支持从一端或两端(取决于vector或deque的情况)删除。

在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.。那么新的方法是什么呢?deque情况下我该怎么做?

c#等价于c++的vector或deque

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

这是Stephen Cleary的一个好例子。这提供了O(1)次操作来索引,以及在开始处插入和在结束处追加。

与Vector等价的c#是List<T>。索引访问是O(1),但插入或删除是O(N)(末尾插入是O(1)除外)。

对于c# vector,一个很好的候选是System.Collection.Generic.List,正如其他人提到的。
在c++中最接近deque的是System.Collection.Generic.LinkedList,它是一个双重链表。

考虑System.Collections.Generic.ListSystem.Collection.Generic的其他版本,它们与C++的等效版本具有相同的目的。
此外,可能会有更多的容器供您使用。看这里。

虽然不能执行索引操作,但在常量时间内,linkedlist可能是最接近实现先去队列和后去队列的方法之一。

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

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);
}
}

对我来说,这些简单的扩展方法就足够了。

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);
        }