Pregunta

Recientemente, tengo un peligroso idea en mi cabeza después de leer este entrada de blog.Que idea puede ser expresada así:

No necesito más de lo que el estándar de C++ biblioteca ofrece.Así que, ¿por qué no implementar un menos general, pero más fácil de usar la versión?

Como un ejemplo, el uso de la STL escupe resmas de incomprensible y destrozado de errores del compilador.Pero, no me importa asignadores, iteradores y similares.Así que ¿por qué no tomar un par de horas y aplicar un fácil utilizar la lista enlazada de la clase, por ejemplo?

Lo que me gustaría saber a partir de la StackOverflow comunidad es este:¿cuáles son los peligros, las posibles desventajas y posibles ventajas para rodar "mi propia" para la mayoría de la funcionalidad existente en C++?

Editar: Me parece que la gente ha entendido mal conmigo acerca de esta idea.La idea era saber si yo podría poner en marcha un muy pequeño conjunto de STL funcionalidad que se simplifica mucho más, como un proyecto que me enseñe acerca de las estructuras de datos y similares.Yo no propongo re-inventar la rueda entera desde el suelo hacia arriba, solo la parte que me necesitan y quieren aprender. Supongo que lo que quería averiguar es si la complejidad del uso de la STL garantiza la creación de menor tamaño, la versión más simple de la misma.

Re-uso de impulso o similar.

La mayoría de lo que el código es para la Universidad y no está permitido el uso de librerías externas.Así que o es el estándar de C++ biblioteca, o mis propias clases.

La objetividad de esta pregunta.

Esta pregunta es no subjetivo.Ni debe ser Wiki de la comunidad, ya que no es una encuesta.Quiero concreto argumentos que ponen de relieve una ventaja o una desventaja que podría posiblemente se producen con mi enfoque.Contrariamente a la creencia popular, esto no es opinión, sino que se basa en la experiencia o buena argumentos lógicos.

Formato.

Por favor enviar solamente una desventaja o una de las ventajas por respuesta.Esto permitirá a las personas a evaluar las ideas individuales en lugar de todas sus ideas a la vez.

Y por favor...

Ninguna de las guerras de religión.Yo no soy un fan boy de cualquier idioma.Yo uso lo que sea aplicable.Para los gráficos y la compresión de datos (lo que estoy trabajando en este momento) que parece ser de C++.Por favor, limitar sus respuestas a la pregunta o que va a ser votada abajo.

¿Fue útil?

Solución

Así que, ¿por qué no implementar un menor general, pero más fácil de usar la versión?

Porque no se puede.Porque cualquier otra cosa que podría decir acerca de C++ no es un lenguaje sencillo, y si ya no eres muy buena en eso, su lista enlazada de aplicación serán buggy.

Honestamente, la elección es simple:

Aprender C++, o no lo use.Sí, C++ se utiliza comúnmente para los gráficos, pero Java tiene librerias de OpenGL demasiado.Lo hace C#, Python y prácticamente cualquier otro idioma.O C.Usted no tiene que usar C++.

Pero si usted hace uso de ella, aprender de ella y utilizarla de manera adecuada.

Si desea inmutable cadenas, crear su cadena como const.

Y a pesar de su implementación subyacente, el STL es muy simple de usar.

Compilador de C++ errores puede se leer, pero se necesita un poco de práctica.Pero lo más importante, no son exclusivos de la STL código.Te encontrarás con ellos no importa lo que hagas, y que las bibliotecas de utilizar.Para que se acostumbren a ellos.Y si usted está acostumbrando a ellos de todos modos, usted podría utilizar STL demasiado.

Aparte de eso, un par de otros inconvenientes:

  • Nadie va a entender el código.Si haces una pregunta sobre por LO que alrededor de std::vector, o iteradores bidireccionales, de todos los que razonablemente familiarizado con c++ puede responder.Si usted pide que termine Mi::CustomLinkedList, nadie te puede ayudar.Lo cual es lamentable, porque rodar sus propios también significa que habrá más errores para pedir ayuda.
  • Estás tratando de curar el síntoma, en lugar de la causa.El problema es que usted no entiende C++.STL es sólo un síntoma de que.Evitar STL no por arte de magia de hacer de su C++ código de trabajo mejor.
  • Los errores del compilador.Sí, son desagradables para leer, pero están ahí.Un montón de trabajo en la STL se ha hecho para asegurar que el mal uso que va a desencadenar errores del compilador en la mayoría de los casos.En C++ es muy fácil hacer que el código que se compila, pero no funciona.O parece que funciona.O funciona en mi equipo, pero falla misteriosamente en otros lugares.Su propia lista enlazada es casi seguro que mover más que los errores en tiempo de ejecución, donde se iba sin ser detectado por un tiempo, y ser mucho más difícil de rastrear.
  • Y una vez más, va a ser buggy.Confía en mí.He visto muy bueno los programadores de C++ escribir una lista enlazada en C++ sólo para descubrir error tras error, en plena frontera de los casos.Y C++ es todos los casos fronterizos.Va a su lista enlazada excepción de identificador de seguridad correctamente?Se garantiza que todo está en un estado coherente si se crea un nuevo nodo (y por lo tanto, llamar el tipo de objeto del constructor) lanza una excepción?Que no se escape de la memoria, que de todos los destructores se llama?Va a ser como el tipo de seguro?Va a ser tan eficiente?Hay un montón de dolores de cabeza para lidiar con la hora de escribir contenedor de clases en C++.
  • Te estás perdiendo de una de las más potentes y flexibles de las bibliotecas en la existencia, en cualquier lenguaje.La STL puede hacer un montón de que sería un dolor incluso con Java gigantes de la hinchada de la biblioteca de clases.C++ es bastante difícil ya, no hay necesidad de tirar a la basura las pocas ventajas que ofrece.

No me importa acerca de asignadores, los iteradores y similares

Asignadores puede ser ignorado.Casi ni siquiera es necesario saber que existen.Los iteradores son brillantes, sin embargo, y pensando de ellos iba a ahorrar un montón de dolores de cabeza.Sólo hay tres conceptos que usted necesita para entender el uso de STL de manera efectiva:

  • Contenedores:Usted ya sabe acerca de estos.vectores, listas enlazadas, los mapas, los conjuntos, las colas y así sucesivamente.
  • Los iteradores:Abstracciones que permiten navegar de un contenedor (o subconjuntos de un contenedor, o cualquier otra secuencia de valor, en la memoria, en el disco en forma de arroyos, o se calcula sobre la marcha).
  • Algoritmos:Común de los algoritmos que trabajan sobre cualquier par de iteradores.Tiene clase, for_each, buscar, copiar y muchos otros.

Sí, el STL es pequeño en comparación con Java de la biblioteca, pero los paquetes de una sorprendente cantidad de energía cuando se combinan las anteriores 3 conceptos.Hay un poco de una curva de aprendizaje, porque se trata de una singular biblioteca.Pero si vas a pasar más de un día o dos con C++, es que vale la pena aprender correctamente.

Y no, no estoy siguiendo tu formato de respuesta, porque pensé que en realidad dar una respuesta detallada sería más útil.;)

Editar:

Sería tentador decir que una de las ventajas de rodar su propio es que te gustaría aprender más de la lengua, e incluso por qué la STL es una de sus gracias salvadoras..Pero no estoy muy convencido de que es cierto.Podría funcionar, pero puede ser contraproducente demasiado.

Como he dicho anteriormente, es fácil escribir código C++ que parece para el trabajo.Y cuando deja de funcionar, es fácil para reorganizar algunas cosas, como el orden de declaración de variables, o insertar un poco de relleno en una clase, para hacer aparentemente el trabajo de nuevo.¿Qué te gustaría aprender de eso?Habría que enseñar cómo escribir mejor C++?Tal vez.Pero lo más probable es que acababa de enseñar que "C++ chupa".Tendría que enseñarle cómo usar la STL?Definitivamente no.Un enfoque más útil podría ser la utilización de la impresionante potencia de StackOverflow en el aprendizaje de la STL de la manera correcta.:)

Otros consejos

Desventaja: nadie más que lo usará.

Ventaja: En el proceso de implementación, aprenderá por qué la Biblioteca estándar es algo bueno.

Ventajas: comer su propia comida para perros. Obtienes exactamente lo que haces.

Desventajas: comer su propia comida para perros. Numerosas personas, más inteligentes que el 99% de nosotros, han pasado años creando STL.

Te sugerí que aprendieras por qué:

  

usando el STL escupe resmas de   compilador incomprensible y destrozado   errores

primero

Desventaja: puede pasar más tiempo depurando su biblioteca de clase que resolviendo cualquier tarea universitaria que tenga frente a usted.

Ventaja: ¡es probable que aprendas mucho!

Hay algo que puede hacer sobre los mensajes de error STL del compilador críptico. STLFilt ayudará a simplificarlos. Del Sitio web de STLFilt :

  

STLFilt simplifica y / o reformatea   error y advertencia de C ++ de largo aliento   mensajes, con un enfoque en STL   diagnóstico (y para MSVC 6, completamente   elimina las advertencias C4786 y sus   detrito). El resultado genera muchos de   incluso los diagnósticos más crípticos   comprensible.

Eche un vistazo aquí y, si está utilizando VisualC, también aquí .

Creo que deberías hacerlo.

Estoy seguro de que me sentiré flambayado por esto, pero ya sabes, cada programador de C ++ por aquí ha bebido demasiado líquido refrigerante STL.

El STL es una gran biblioteca, pero sé por experiencia de primera mano que si enrollas la tuya, puedes:

1) Hazlo más rápido que el STL para tus casos de uso particulares. 2) Escribirás una biblioteca con solo las interfaces que necesitas. 3) Podrás extender todas las cosas estándar. (No puedo decirte cuánto he deseado que std :: string tuviera un método split ()) ...

Todos tienen razón cuando dicen que será mucho trabajo. Eso es cierto.

Pero, aprenderás mucho. Incluso si después de escribirlo, vuelve al STL y nunca lo vuelve a usar, todavía habrá aprendido mucho.

Desventaja: en mi humilde opinión, reimplificar las bibliotecas probadas y comprobadas es un agujero de rabit que está casi garantizado para ser más problemático de lo que vale.

Un poco de mi experiencia: no hace mucho tiempo he implementado mi propia clase de vectores porque necesitaba un buen control sobre ella.

Como necesitaba genérico, hice una matriz con plantilla.

También quería iterar a través de él sin usar el operador [] sino incrementar un puntero como lo haría con C, por lo que no calculo la dirección de T [i] en cada iteración ... Agregué dos métodos uno para devolver el puntero a la memoria asignada y otro que devuelve un puntero al final. Para iterar a través de una matriz de enteros, tuve que escribir algo como esto:

for(int * p = array.pData(); p != array.pEnd(); ++p){
  cout<<*p<<endl; 
}

Luego, cuando empiezo a usar vectores de vectores, descubrí que, cuando era posible, podía asignar un gran bloque de memoria en lugar de llamar a muchas veces nuevas. En este momento agrego un asignador a la clase de plantilla.

Solo entonces noté que había escrito un clon perfectamente inútil de std :: vector < > ;.

Al menos ahora sé por qué uso STL ...

Otra desventaja :

Si desea obtener un trabajo en C ++ cuando haya terminado con la Universidad, la mayoría de las personas que deseen reclutarlo esperarán que esté familiarizado con la biblioteca de C ++ estándar. No necesariamente íntimamente familiarizado con el nivel de implementación, pero ciertamente familiarizado con su uso y modismos. Si vuelve a implementar la rueda en forma de su propia biblioteca, perderá esa oportunidad. Esto no obstante el hecho de que, con suerte, aprenderá mucho sobre el diseño de la biblioteca si desarrolla el suyo propio, lo que podría ganarle un par de puntos de brownie adicionales según el lugar de la entrevista.

Desventaja:

Estás introduciendo una dependencia en tu propia biblioteca nueva. Incluso si eso es suficiente, y su implementación funciona bien, todavía tiene una dependencia. Y eso puede morderte mucho con el mantenimiento del código. Todos los demás (incluido usted mismo, dentro de un año o incluso un mes) no estarán familiarizados con su comportamiento de cadena único, iteradores especiales, etc. Se necesitará mucho esfuerzo solo para adaptarse al nuevo entorno antes de que pueda comenzar a refactorizar / extender cualquier cosa. Si usa algo como STL, todos lo sabrán, está bien entendido y documentado, y nadie tendrá que volver a aprender su entorno personalizado desechable.

Puede que le interese EASTL , una reescritura de STL Electronic Arts documentada hace un tiempo. Sus decisiones de diseño fueron impulsadas principalmente por los deseos / necesidades específicos en la programación de videojuegos multiplataforma. El resumen en el artículo vinculado lo resume muy bien.

Desventaja: su curso universitario probablemente se presenta así por una razón. El hecho de que esté lo suficientemente irritado (sarcasmo no previsto) puede indicar que no está recibiendo el paridigma y se beneficiará mucho cuando tenga un cambio de paradigma.

Ventaja

Si observa MFC, encontrará que su sugerencia ya se utiliza en código productivo, y lo ha sido durante mucho tiempo. Ninguna de las clases de colección de MFC usa el STL.

¿Por qué no echa un vistazo a las bibliotecas C ++ existentes? Cuando C ++ no era tan maduro, la gente a menudo escribía sus propias bibliotecas. Eche un vistazo a Symbian (aunque bastante horrible), Qt y WxWidgets (si la memoria me sirve) tienen colecciones y cosas básicas, y probablemente hay muchas otras.

Mi opinión es que la complejidad de STL se deriva de la complejidad del lenguaje C ++, y hay poco que pueda hacer para mejorar STL (aparte de usar una convención de nomenclatura más sensata). Recomiendo simplemente cambiar a otro idioma si puede, o simplemente tratarlo.

Como un ejemplo, el uso de la STL escupe resmas de incomprensible y mutilada errores del compilador

La razón de esto es, esencialmente, las plantillas de C++.Si el uso de plantillas (como STL hace) obtendrá reams de incomprensible los mensajes de error.Así que si puedes implementar tu propia plantilla en función de las clases de colección no va a estar en cualquier lugar mejor.

Usted podría hacer no basado en plantillas contenedores y guardar todo lo que como punteros void o alguna clase base, por ejemplo,Pero sería perder el tiempo de compilación tipo de cheques y C++ chupa como un lenguaje dinámico.No es tan seguro de ello como sería, por ejemplo, deObjective-C, Python o Java.Una de las razones es que C++ no tiene una clase raíz de todas las clases para todos los introspección en todos los objetos y básicos de manejo de errores en tiempo de ejecución.Por el contrario su aplicación probablemente colapsará si te has equivocado sobre el tipo y no se da ninguna pista de lo que salió mal.

Desventaja : volver a implementar todo de ese bien (es decir, con un alto nivel de calidad) sin duda requerirá una gran cantidad de grandes desarrolladores unos años.

  

¿Cuáles son los peligros, posibles desventajas y posibles ventajas de " rodar mi propio " para la mayoría de las funciones existentes en C ++?

¿Puede permitirse y posiblemente justificar la cantidad de esfuerzo / tiempo / dinero gastado detrás de reinventar la rueda?

  

Reutilización de boost o similar.

Más bien extraño que no puedas usar Boost. IIRC, llegan trozos de contribución de personas relacionadas / que trabajan en universidades (piense en Jakko Jarvi). Las ventajas de usar Boost son demasiadas para enumerarlas aquí.

  

Sobre no 'reinventar la rueda'

Desventaja: Si bien aprendes mucho, también te retrasas cuando piensas en cuáles son los objetivos reales de tu proyecto.

Ventaja: El mantenimiento es más fácil para las personas que van a heredar esto.

STL es muy complejo porque debe ser para una biblioteca de uso general.

Razones por las cuales STL es como es:

  • Basado en interadores, por lo que los algoritmos estándar solo necesitan una única implementación para diferentes tipos de contenedores.
  • Diseñado para comportarse correctamente ante las excepciones.
  • Diseñado para ser seguro para 'subprocesos' en aplicaciones de subprocesos múltiples.

Sin embargo, en muchas aplicaciones realmente tiene suficiente con lo siguiente:

  • clase de cadena
  • tabla hash para búsquedas de O (1)
  • vector / array con sort / y búsqueda binaria para colecciones ordenadas

Si sabes eso:

  • Sus clases no arrojan excepciones en la construcción o asignación.
  • Su código es de un solo hilo.
  • No utilizará los algoritmos STL más complejos.

Entonces probablemente pueda escribir su propio código más rápido que use menos memoria y produzca errores de compilación / tiempo de ejecución más simples.

Algunos ejemplos para más rápido / más fácil sin el STL:

  • Cadena de copia en escritura con búfer de cadena contada de referencia. (No haga esto en un entorno de subprocesos múltiples, ya que necesitaría bloquear el acceso de recuento de referencia).
  • Use una buena tabla hash en lugar de std :: set y std :: map.
  • iteradores de estilo 'Java' que se pueden pasar como un solo objeto
  • Tipo de iterador que no necesita saber el tipo del contenedor (para un mejor desacoplamiento del código en tiempo de compilación)
  • Una clase de cadena con más funciones de utilidad
  • Verificación de límites configurables en sus contenedores de vectores. (Por lo tanto, no [] o .at, sino el mismo método con un indicador de compilación o tiempo de ejecución para pasar del modo 'seguro' al 'rápido')
  • Contenedores diseñados para trabajar con punteros a objetos que eliminarán su contenido.

Parece que actualizaste la pregunta, así que ahora realmente hay dos preguntas:

  1. ¿Qué debo hacer si creo que la biblioteca std :: es demasiado compleja para mis necesidades?

Diseñe sus propias clases que utilicen internamente las funciones relevantes de la biblioteca std :: para hacer " levantamiento pesado " para ti. De esa manera, tiene menos errores, y aún puede inventar su propia interfaz de codificación.

  1. ¿Qué debo hacer si quiero aprender cómo funcionan las estructuras de datos?

Diseñe su propio conjunto de clases de estructura de datos desde cero. Luego trate de averiguar por qué los estándares son mejores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top