小智 11
假设你有一张地图<X,Y>.构建第二个结构,可能是一个<Y*,X*,Deref>启用反向查找的映射,但避免将存储开销加倍,因为使用指针时,不需要存储每个X和Y两次.第二个结构只是指向第一个结构.
另一个解决方案是使用(鲜为人知的?)Boost.Bimap:
Boost.Bimap是一个用于C++的双向映射库.使用Boost.Bimap,您可以创建关联容器,其中两种类型都可以用作键.A
bimap<X,Y>可以被认为是astd::map<X,Y>和a 的组合std::map<Y,X>.如果您知道如何使用标准容器,那么bimap的学习曲线几乎是平坦的.在Boost.Bimap中映射STL的命名方案已经付出了很多努力.该库旨在匹配常见的STL容器.
给定std::map从键到值,以下函数将返回一个反向查找表,std::map从值到键。
/// Given a map from keys to values, creates a new map from values to keys
template<typename K, typename V>
static map<V, K> reverse_map(const map<K, V>& m) {
map<V, K> r;
for (const auto& kv : m)
r[kv.second] = kv.first;
return r;
}
Run Code Online (Sandbox Code Playgroud)