2011-04-13 7 views
19

¿Existe una alternativa utilizable al bimap de Boost en C++ 0x?¿Hay una alternativa de Boost.Bimap en C++ 11?

Me gustaría evitar Boost, pero abrazo completamente a C++ 11. Si es necesario, una versión reducida del bimap de Boost funcionaría para mí (necesito un bimap constante para alternar entre las enumeraciones y las cadenas correspondientes) a lo largo de mi programa. El mapa será constante en tiempo de compilación, por lo que quizás incluso dos mapas mantenidos manualmente no sean la solución óptima.

Gracias!

ACTUALIZACIÓN: He encontrado esto en el código del proyecto, pero parece que la concesión de licencias puede ser un problema: http://www.codeproject.com/KB/stl/bimap.aspx?fid=12042&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=151#xx0xx

Sólo estoy buscando una solución limpia y fácil (un archivo de cabecera/fuente o poco más, como dos mapas mirrorred son igualmente buenos en mi caso).

+5

¿Por qué quiere evitar el uso de boost? Si resuelve su problema ... Tenga en cuenta que boost contiene muchas bibliotecas diferentes, algunas de las cuales llegaron al estándar, pero muchas de ellas son demasiado específicas para ser agregadas al estándar. –

+0

@David: Lo entiendo, pero 1) Boost en Windows es una molestia, 2) Quiero aprender C++ con este proyecto; Sé que Boost es C++ y una buena forma de aprenderlo, pero me gustaría ver qué puedo hacer yo mismo y descubrir la funcionalidad ya presente. Explicación extraña, lo sé, pero todo en Boost (lo necesitaría) necesita cosas que no sean solo de encabezado, que al menos son grandes. Y he podido evitar/trabajar con Boost de forma bastante simple por ahora, me gustaría mantenerlo así. Reduje el problema a una envoltura de contenedor que esencialmente mantiene dos mapas actualizados, lo cual no es realmente algo difícil de hacer usted mismo. – rubenvb

+5

¿Cómo es una molestia para Boost en Windows, especialmente cuando se habla de una biblioteca de encabezado único como boost.bimap? Extraiga los encabezados, agréguelos a sus directorios de inclusión, listo. – ildjarn

Respuesta

10

Mi sensación es una gran parte del trabajo que va a bibliotecas Boost está obligando a trabajar con otras bibliotecas/STL.

Si no necesita esa capacidad, puede usar una clase con std::map<X*, Y*> y std::map<Y*, X*>. Luego, tenga métodos como los siguientes: add(X,Y), remove(X,Y), get_left(X) y get_right(Y).

Si desea almacenar copias, add(X,Y) podría asignar memoria, y remove(X,Y) puede desasignar. Además, puede definir un destructor que llame al remove(X,Y) en el resto de los elementos.

+0

No debería ser esto std: map y std :: map Gio

39

Respuesta corta: no.

Respuesta larga: no.


Cabe señalar que el apoyo C++ 1 4 's para transparent comparators elimina la necesidad de Boost.Bimap 90% del tiempo *: cuando hay que introducir fuera de cualquier dada la propiedad de un objeto (almacenado o calculado), a menudo un identificador único simple, comparable con el bit inherente/presente en el objeto de todos modos. Con los comparadores transparentes, puede comparar un objeto con cualquier valor posible, discriminado solo por tipo, siempre que dicho valor se pueda obtener/calcular a partir de un objeto sin mutarlo.

* un cálculo aproximado, no una estadística

+10

No sé por qué esto es tan votado: creo que una mejor "respuesta larga" sería una breve explicación de por qué no se considera necesario; lo que sería un enfoque más idiomático. Creo que mucha gente (ciertamente soy culpable) tropieza con Boost cuando intentan hackear algo de una manera no muy C++ - y; El deseo de OP de evitar que aprenda es bueno, creo (no menos porque lo comparto). – OJFord

+2

@OllieFord: Fue una broma bastante irónica, ya que 'no' era demasiado corto para publicar como su propia respuesta. ; -] – ildjarn

+2

Entonces, ¿cómo ayudarían los comparadores transparentes a definir un enum <-> string bimap? Esto haría que esta respuesta realmente responda mi pregunta. Actualmente, se lee como un anuncio superficial para una función de C++ 14 sin ninguna indicación de utilidad. – rubenvb