在 boost/bimap.hpp
中定义的 boost::bimap
为我们提供了两个属性: left 和 right 来访问在 boost::bimap
统一的两个 std::map
类型的容器。 在例子中, left 用 std::string
类型的 key 来访问容器, 而 right 用到了 int
类型的 key。
除了支持用 left 和 right 对容器中的记录进行单独的访问, boost::bimap
还允许像下面的例子一样展示记录间的关联关系。
对一个记录访问时, left 和 right 并不是必须的。 你也可以使用迭代器来访问每个记录中的 left 和 right 容器。
第一个 例子也可以像下面这样写。
除了 boost::bimaps::set_of
, 你还可以用一些其他的容器类型来定制你的 boost::bimap
。
代码中的容器使用了定义在 boost/bimap/multiset_of.hpp
中的 boost::bimaps::multiset_of
。 这个容器的操作和 boost::bimaps::set_of
差不了多少, 只是它不再要求 key 值是唯一的。 因此, 上面的例子将会在计算 age 为 31 的 person 数时输出: 2
。
Boost.Bimap 还提供了类: boost::bimaps::unordered_set_of
, boost::bimaps::unordered_multiset_of
, boost::bimaps::list_of
,boost::bimaps::vector_of
和 以供使用。 除了 boost::bimaps::unconstrainted_set_of
, 剩下的所有容器类型的使用方法都和他们在 C++ 标准里的版本一样。
boost::bimaps::unconstraintedset_of
可以使 boost::bimap
的 _right (也就是 age)值无法用来查找 person。 在这种特定的情况下, boost::bimap
可以被视为是一个 std::map
类型的容器。
虽然如此, 例子还是向我们展示了 boost::bimap
对于 std::map
的优越性。 因为 Boost.Bimap 是基于 Boost.MultiIndex 的, 你当然可以使用 Boost.MultiIndex 提供的所有函数。 例子中就用 modify_key()
修改了 key 值, 这在 std::map
中是不可能的。
boost/bimap/support/lambda.hpp
还定义了 boost::bimaps::_data。 函数 modify_data()
可以用来修改 boost::bimap
中的 value 值。