Is there a Boost.Bimap alternative in c++11?
Is there a usable alternative to Boost's bimap
in C++0x?
I would like to avoid Boost, but fully embrace C++11. If necessary, a slimmed down version of Boost's bimap
would work for me (I need a constant bimap
to switch 开发者_运维技巧between enums and corresponding strings) throughout my program. The map will be compile-time constant, so perhaps even two manually maintained maps aren't the optimal solution.
UPDATE: I found this on The Code Project, but it seems licensing may be an issue: http://www.codeproject.com/KB/stl/bimap.aspx?fid=12042&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=151#xx0xx
I'm just looking for a clean and easy solution (one header/source file or little extra, as two mirrorred maps are equally fine in my case).
Short answer: no.
Long answer: nope.
It should be noted that C++14's support for transparent comparators eliminates the need for Boost.Bimap 90% of the time*: when you need to key off of any given property of an object (stored or computed), often a simple, bitwise-comparable unique identifier inherent to/present in the object anyway. With transparent comparators, you can compare an object to any possible value, discriminated only by type, as long as said value can be obtained/computed from an object without mutating it.
* a guesstimate, not a statistic
My feeling is a lot of the work that goes into Boost libraries is making them work with other libraries/STL.
If you don't need that capability, you could just use a class with a std::map<X*, Y*>
and std::map<Y*, X*>
. Then have methods like the following: add(X,Y)
, remove(X,Y)
, get_left(X)
and get_right(Y)
.
If you want to store copies, add(X,Y)
could allocate memory, and remove(X,Y)
can de-allocate. Also, you can then define a destructor that calls remove(X,Y)
on the remainder of the elements.
精彩评论