Есть ли альтернатива Boost.Bimap в С++ 11?
Есть ли полезная альтернатива Boost bimap в С++ 0x?
Я бы хотел избежать Boost, но полностью использовать С++ 11. Если необходимо, для меня будет работать уменьшенная версия Boost bimap (мне нужна постоянная бимап для переключения между перечислениями и соответствующими строками) в моей программе. Карта будет постоянной времени компиляции, поэтому, возможно, даже две карты, поддерживаемые вручную, не являются оптимальным решением.
Спасибо!
UPDATE: я нашел это в проекте Code, но похоже, что лицензирование может быть проблемой: http://www.codeproject.com/KB/stl/bimap.aspx?fid=12042&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=151#xx0xx
Я просто ищу чистое и простое решение (один заголовок/исходный файл или немного лишний, поскольку две зеркальные карты одинаково хороши в моем случае).
Ответы
Ответ 1
Я чувствую, что большая часть работы, которая идет в библиотеки Boost, заставляет их работать с другими библиотеками /STL.
Если вам не нужна эта возможность, вы можете просто использовать класс с std::map<X*, Y*>
и std::map<Y*, X*>
. Затем выполните следующие методы: add(X,Y)
, remove(X,Y)
, get_left(X)
и get_right(Y)
.
Если вы хотите хранить копии, add(X,Y)
может выделить память, а remove(X,Y)
может быть выделено. Кроме того, вы можете определить деструктор, который вызывает remove(X,Y)
в остальной части элементов.
Ответ 2
Короткий ответ: нет.
Длинный ответ: нет.
Следует отметить, что поддержка С++ 14 для прозрачных компараторов устраняет необходимость в Boost.Bimap 90% времени *: когда вам нужно отменить любое заданное свойство объекта (сохраненное или вычисленное), часто это простой, побитоподобный уникальный идентификатор, присущий/присутствующему в объекте. С прозрачными компараторами вы можете сравнить объект с любым возможным значением, распознанным только по типу, если указанное значение может быть получено/вычислено из объекта без его изменения.
* признак, а не статистический