usar - clase stl c++
¿Por qué los contenedores STL son preferibles a los contenedores MFC? (13)
Anteriormente, solía usar clases de colección MFC como CArray
y CArray
. Después de un tiempo cambié a los contenedores STL y los he estado usando por un tiempo. Aunque encuentro que STL es mucho mejor, no puedo precisar las razones exactas de ello. Algunos de los razonamientos tales como:
- Requiere MFC: no se cumple porque otras partes de mi programa usan MFC
- Es dependiente de la plataforma: no se mantiene porque ejecuto mi aplicación solo en Windows. (No hay necesidad de portabilidad)
- Está definido en el estándar de C ++: está bien, pero los contenedores MFC aún funcionan
La única razón por la que podría aparecer es que puedo usar algoritmos en los contenedores. ¿Hay alguna otra razón por la que me esté perdiendo? ¿Qué hace que los contenedores STL sean mejores que los contenedores MFC?
Ahora se asume que los desarrolladores de C ++ están al menos familiarizados con la STL. No es así para los contenedores MFC. Entonces, si está agregando un nuevo desarrollador a su equipo, le será más fácil encontrar uno que sepa STL que los contenedores MFC, y por lo tanto podrá contribuir de inmediato.
Contenedores STL:
- Tener garantías de rendimiento.
- Se puede utilizar en algoritmos STL que también tienen garantías de rendimiento.
- Puede ser aprovechado por bibliotecas de C ++ de terceros como Boost
- Son estándar, y es probable que sobrevivan a soluciones propietarias
- Fomentar la programación genérica de algoritmos y estructuras de datos. Si escribe nuevos algoritmos y estructuras de datos que se ajustan a STL, puede aprovechar lo que STL ya proporciona sin costo alguno.
Creo que se reduce a una simple pregunta: ¿En quién confías más? Si confía en Microsoft, continúe utilizando las variantes de MFC. Si confías en la industria, usa STL.
Yo voto por STL porque el código que se ejecuta en Windows hoy podría necesitar ser portado a otra plataforma mañana. :)
De hecho, también puede utilizar algoritmos STL en algunos de los contenedores MFC . Sin embargo, los contenedores STL se prefieren por otra razón muy práctica: muchas bibliotecas de terceros (Boost, arabica, Crypto ++, utf-cpp ...) están diseñadas para funcionar con STL, pero no saben nada acerca de los contenedores MFC.
Debido a que una biblioteca que usa iteradores para combinar secuencias de cualquier tipo con algoritmos para que A) todas las permutaciones razonables sean posibles y B) sea extensible universalmente, es (cuando piensa en su concepto de una biblioteca de contenedores como lo fue hace 15 años) tal ¿Una idea alucinante, maravillosa, que ha sacado del agua prácticamente todo lo demás en menos de una década?
En serio, el STL tiene sus defectos (¿por qué no los rangos en lugar de los iteradores? Y ese lenguaje de borrado-eliminar no es precisamente bonito), pero se basa en una idea brillante y hay muy buenas razones por las que no necesitamos aprender un nuevo contenedor / biblioteca de algoritmos cada vez que comenzamos en un nuevo trabajo.
Este es un caso en el que las herramientas funcionan para el trabajo que desea hacer, y "mejor" es un término subjetivo.
Si necesita usar sus contenedores con otro código que cumpla con los estándares, o si alguna vez va a ser un código compartido entre plataformas, los contenedores STL probablemente sean una mejor opción.
Si está seguro de que su código permanecerá en MFC-land y los contenedores de MFC funcionan para usted, ¿por qué no continúa usándolos?
Los contenedores STL no son intrínsecamente mejores que los contenedores MFC, sin embargo, como son parte del estándar, son más útiles en una amplia gama de contextos.
Junto a los aspectos mencionados: bien soportado, estándar disponible, optimizado para el rendimiento, diseñado para usar con los algoritmos, podría agregar un aspecto más: seguridad de tipos y muchas revisiones de tiempo de compilación. Ni siquiera puedes imaginarte sacar un double
de un std::set<int>
.
Los contenedores MFC se derivan de CObject
y CObject
hace que el operador de la asignación se haga privado. He encontrado esto muy molesto en la práctica.
std::vector
, unlinke CArray , garantiza que el bloque de memoria es contiguo, por lo que puede interoperar con las interfaces de programación C fácilmente:
std::vector<char> buffer;
char* c_buffer = &*buffer.begin();
No descartaría totalmente el argumento de la portabilidad. Solo porque uses MFC hoy no significa que siempre lo harás. E incluso si escribe principalmente para MFC, parte de su código podría reutilizarse en otras aplicaciones si fuera más genérico y basado en estándares.
Creo que la otra razón para considerar STL es que su diseño y evolución se han beneficiado de las bibliotecas anteriores, que incluyen MFC y ATL. Muchas de las soluciones son más limpias, más reutilizables y menos propensas a errores. (Aunque me gustaría que tuvieran una convención de nombres mejor).
Ronald Laeremans, Gerente de la Unidad de Producto VC ++, incluso dijo que usaría STL en junio de 2006:
Y francamente el equipo te dará la misma respuesta. Las clases de colección MFC solo están ahí por compatibilidad hacia atrás. C ++ tiene un estándar para las clases de recopilación y es la biblioteca de estándares de C ++. No hay inconveniente técnico para usar cualquiera de las bibliotecas estándar en una aplicación MFC.
No planeamos hacer cambios significativos en esta área.
Ronald Laeremans
Gerente de Unidad de Producto Interino
Equipo de Visual C ++
Sin embargo, en un momento en el que estaba trabajando en un código que se ejecutó durante la fase de instalación de Windows, no se me permitió usar contenedores STL, pero me dijeron que usara contenedores ATL (en realidad, CString
en particular, lo que supongo que no es realmente un contenedor). La explicación fue que los contenedores de STL tenían dependencias de bits de tiempo de ejecución que podrían no estar disponibles en el momento en que el código tenía que ejecutarse, mientras que esos problemas no existían para las colecciones de ATL. Este es un escenario bastante especial que no debería afectar al 99% del código que existe.
Siempre prefiero usar más bibliotecas estándar / compatibles donde pueda, ya que puedo tener proyectos futuros en los que puedo reutilizar una parte del código. No tengo idea de qué bibliotecas usarán los proyectos futuros, pero tengo una mejor oportunidad de hacer que mi código sea reutilizable si uso material estándar / compatible.
Además, cuanto más uso una biblioteca, más cómodo y más rápido me pongo. Si voy a invertir el tiempo para aprender una biblioteca, quiero asegurarme de que se mantenga y no esté vinculado a una plataforma o marco específico.
Por supuesto, digo todo esto suponiendo que mis opciones son bastante similares en lo que respecta al rendimiento, las características y la facilidad de uso. Por ejemplo, si las clases MFC son una mejora suficientemente significativa en estas áreas, las utilizaría en su lugar.
- Compatibilidad con otras bibliotecas (como boost) en sintaxis, interoperabilidad y paradigma. Es un beneficio no trivial.
- El uso de STL desarrollará un conjunto de habilidades que es más probable que sea útil en otros contextos. MFC ya no se usa mucho; STL es.
- El uso de STL desarrollará una mentalidad que puede (o no) encontrar útil en el código que usted mismo escribe.
Sin embargo, usar algo que no sea STL no es inherentemente incorrecto.
- STL tiene más tipos de colección que MFC
- El depurador de Visual Studio (2008+) visualiza STL mucho mejor que MFC. (La magia de AUTOEXP.DAT puede arreglar eso, pero es un dolor. No hay nada como depurar el depurador cuando lo arruinas ...)
Algo bueno con MFC es que todavía hay un gran corpus de código MFC por ahí. Otras respuestas hablan de compatibilidad con terceros. No te olvides de cosas basadas en MFC de terceros.