2012-09-26 7 views
6

problema es simple: Tenemos una clase que tiene miembros a, b, c, d ... Queremos poder buscar rápidamente (valor de clave de un miembro) y actualizar la lista de clase con un nuevo valor al proporcionar valor actual para aob bo ... Pensé en tener un montón de
std::map<decltype(MyClass.a/*b,c,d*/),shared_ptr<MyClass>>.¿Está utilizando un mapa donde value es std :: shared_ptr una buena opción de diseño para tener listas de clases con varios índices?

1) ¿Es esa una buena idea?

2) ¿Es el impulso multi índice superior a esta solución artesanal en todos los sentidos?

PS SQL está fuera de cuestión por razones de simplicidad/rendimiento.

+0

"* ¿Es el multi índice de impulso superior a esta solución artesanal en todos los sentidos? *" MultiIndex aún no admite la semántica de movimiento. : - [ – ildjarn

Respuesta

7
  1. Boost MultiIndex puede tener una clara desventaja de que tratarán de mantener todos los índices al día después de cada mutación de la colección. Esto puede ser una gran penalización de rendimiento si tiene una fase de carga de datos con muchas escrituras separadas.

  2. Los patrones de uso de Boost Multi Index pueden no coincidir con el estilo de codificación (y gusto ...) del proyecto (miembros). Esto debería ser una desventaja menor, pero pensé que me gustaría mencionar que

  3. Como se mencionó ildjarn, Boost MI no es compatible con la semántica se mueven hasta el momento

De lo contrario, me gustaría considerar impulso MultiIndex superior en la mayoría de las ocasiones, ya que es poco probable que alcance la cantidad de pruebas que recibió.

+0

con respecto a la cantidad de pruebas ... es una comparación difícil ya que la solución artesanal tiene muchas menos pruebas pero también mucho menos LOC – NoSenseEtAl

+0

Lo bueno es solo mi opinión, entonces :) - Al menos el Boost LOC han sido revisados ​​por pares por más pares de ojos que la mayoría de los equipos internos pueden pagar. – sehe

1

Desea considerar la posibilidad de contener todos sus mapas en una sola clase, decidiendo arbitrariamente uno de los contenedores como el que almacena los objetos "reales", y luego simplemente use std::map con un tipo de punteros sin formato correlacionados a elementos del primer std::map.

Sin embargo, esto sería un poco más difícil si alguna vez necesitas hacer copias de esos mapas.

+0

O solo iteradores en el primer mapa en lugar de punteros sin procesar a sus elementos. –

+0

¿Me equivoco al pensar que sizeof shared_ptr en comparación con sizeof iterator no es un gran problema, especialmente porque iirc map tiene 3 punteros por elemento – NoSenseEtAl

+0

@ChristianRau Iterators en el primer mapa, creo que sería el camino equivocado para la mayoría de las aplicaciones. Necesitarían que hicieras algo como 'map.find (key) -> second-> second' en lugar de simplemente' map.find (clave) -> second'. Está agregando una capa adicional de indirección sin ningún beneficio. –

Cuestiones relacionadas