Подтвердить что ты не робот

Есть ли альтернатива 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

Я просто ищу чистое и простое решение (один заголовок/исходный файл или немного лишний, поскольку две зеркальные карты одинаково хороши в моем случае).

4b9b3361

Ответ 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% времени *: когда вам нужно отменить любое заданное свойство объекта (сохраненное или вычисленное), часто это простой, побитоподобный уникальный идентификатор, присущий/присутствующему в объекте. С прозрачными компараторами вы можете сравнить объект с любым возможным значением, распознанным только по типу, если указанное значение может быть получено/вычислено из объекта без его изменения.

* признак, а не статистический