2009-04-12 26 views
14

¿Puede alguien señalar una buena asignación entre los contenedores C++ STL usuales tales como vector, lista, mapa, conjunto, multimapa ... y los contenedores genéricos C#?Asignación entre los contenedores stl C++ y C#

Estoy acostumbrado a los anteriores y de alguna manera me he acostumbrado a expresar algoritmos en términos de esos contenedores. Estoy teniendo dificultades para encontrar el C# equivalente a esos.

¡Gracias!

+1

Ha tropezado con lo que probablemente sea la mayor deficiencia en la biblioteca de clase base de .NET ...Faltan muchos contenedores relativamente comunes. Y aunque LINQ hace un trabajo decente reemplazando los iteradores de C++, todavía no es tan flexible (o eficiente) – jalf

Respuesta

20

Aquí hay una equivalencia aproximada :

  1. Dictionary<K,V> < =>unordered_map<K,V>
  2. HashSet<T> < =>unordered_set<T>
  3. List<T> < =>vector<T>
  4. LinkedList<T> < =>list<T>

.NET BCL (biblioteca de clases base) no tiene árboles rojo-negro (stl map) o colas de prioridad (make_heap(), push_heap(), pop_heap()).

. Las colecciones .NET no usan "iteradores" como lo hace C++. Todos implementan IEnumerable<T>, y se pueden iterar utilizando la instrucción "foreach". Si desea controlar manualmente la iteración, puede llamar a "GetEnumerator()" en la colección que devolverá un objeto IEnumerator<T>. IEnumerator<T>.MoveNext() es más o menos equivalente a "++" en un iterador de C++, y "Actual" es más o menos equivalente al operador de deferencia de puntero ("*").

C# tiene una característica de idioma llamada "iteradores". Sin embargo, no son lo mismo que "objetos iteradores" en el STL. En cambio, son una función de idioma que permite la implementación automática de IEnumerable<T>. Consulte la documentación para las declaraciones yield return y yield break para obtener más información.

+0

Lo siento, pero creo que tiene C++ y Java ligeramente confundidos allí. (Aunque el resto de su discusión parece correcta, todas las clases que enumera a la derecha de la tabla son colecciones Java, no contenedores STL). –

+0

Tenía la carcasa mal, y omití "_" en las cosas picadas (no son estándar, pero la mayoría de los compiladores los admiten). He actualizado los nombres. –

-2

No hay una excelente asignación directa, ya que p. C++ establece y asigna comparadores de uso, mientras que .Net HashSet y Dictionary usan códigos hash.

1

También es posible que desee echar un vistazo a STL/CLR que es

... es un envase de la Biblioteca de plantillas estándar (STL), un subconjunto de la biblioteca estándar de C++, para su uso con C++ y .NET Tiempo de ejecución de lenguaje común de Framework (CLR). Con STL/CLR, puede usar todos los los contenedores, iteradores y algoritmos de STL en un entorno administrado .

Además, tenga en cuenta que puede compilar el código C++/STL existente con la bandera /CLR.

+1

¿Tienes alguna experiencia con eso? Según lo entiendo, solo le permite usar código similar a STL en C++ administrado. No proporciona una implementación similar a STL independiente del lenguaje, ¿o sí? Me encantaría tener algo como STL en C#. :) – jalf

+0

No he intentado esto, pero parece que "todo" lo que tendrías que hacer es agregar una referencia a Microsoft.VisualC.STLCLR e implementar IVector <> (o IDeque <>, IList <>, etc. .) –

Cuestiones relacionadas