2010-09-07 30 views
11

Todavía estoy aprendiendo C# y me sorprendí al descubrir que un List<T> es mucho más como un std::vector que un std::list. ¿Alguien puede describir todas las colecciones de C# en términos de STL (o si las comparaciones de STL son difíciles, tipos de datos conceptuales estándar con enlaces de Wikipedia? Espero que la referencia sea ampliamente útil.Comparación de colecciones C++ STL y colecciones C#?

Incluye una lista mínima de colecciones de interés (agrega a otros):

  • matriz
  • Lista
  • ArrayList
  • HashTable
  • Diccionario
  • ListDictionary
  • SortedDictionary
  • SortedList
  • cola
  • Pila

Editar: Acabo de encontrar esta pregunta similar que pueda ser de su interés: Mapping between stl C++ and C# containers

+2

A menos que tengas que segmentar .NET 1.x, realmente no hay razón para molestarte con los tipos no genéricos si me preguntas. –

+0

LinkedList, HashSet, Lookup (normalmente se hace referencia a través de la interfaz ILookup). No sé STL, pero std :: list no es como List es probablemente más como LinkedList . –

+0

@Brian Rasmussen: ¿Cuáles no son genéricos? Solo el arreglo? –

Respuesta

12

Esto es lo que he encontrado (ignorando las antiguas colecciones no genéricas):

  • Array - array C, aunque el .NET Array puede tener un índice inicial distinto de cero.
  • List<T>-std::vector<T>
  • Dictionary<TKey, TValue>-unordered_map<Key, Data>
  • HashSet<T> - unordered_set<Key>
  • SortedDictionary<TKey, TValue> - std::map<Key, Data>
  • SortedList<TKey, TValue> - equivalente a un std::vector<T> pero manteniendo ordenó mediante el uso de búsqueda binaria + insertar al añadir elementos.
  • SortedSet<T> - std::set<Key>
  • Queue<T> - std::queue<T>
  • Stack<T> - std::stack<T>
  • LinkedList<T> - std::list<T>

Notablemente ausente de las colecciones de .NET son las variantes "multi", por ejemplo, multiset, multimap , etc. Sin embargo, han agregado varias colecciones de threadsafe muy útiles: las variantes "Concurrent-", por ejemplo, ConcurrentDictionary, ConcurrentQueue, etc.

+3

es posible que desee reemplazar 'hash_map' con' unordered_map', que, aunque técnicamente todavía no * estándar *, está incluido en TR1, y se incluirá en C++ 0x. Lo mismo nos ocurre para 'hash_set'->' unordered_set'. Por cierto, otra variante faltante es 'std :: deque'. Hasta donde sé, no hay equivalente .NET. – jalf

+0

Así que no hay equivalente a 'std :: list' y' std :: deque'? – shinzou

+0

@kuhaku: No hay una lista doblemente vinculada. En la práctica, dado que las aplicaciones .NET generalmente usan tipos de referencia, 'List ' (en realidad un vector) suele ser suficiente. Tampoco hay una cola de doble final, y esta es una OMI de omisión más notable. De nuevo, 'List ' se usa generalmente como reemplazo, que funciona bien ya que prevalecen los tipos de referencia. –

Cuestiones relacionadas