另一种可能性是构建反向映射。对于您来说,这将是
std::map<int,std::string>
。反向映射中的条目按其值排序。
以下是我在这种情况下拥有的工具箱内容:
template< typename TK, typename TV, class TP, class TA, typename T1, typename T2 >
inline void asserted_insert(std::map<TK,TV,TP,TA>& m, const T1& k, const T2& v)
{
typedef std::map<TK,TV,TP,TA> map_type;
typedef typename map_type::value_type value_type;
assert( m.insert(value_type(k,v)).second );
}
template< class TMap > struct reverse_map;
template< typename T1, typename T2 > struct reverse_map< std::map<T1,T2> > {
typedef std::map<T2,T1> result_t;
};
template< typename T1, typename T2, class TP1, class TA1, class TP2, class TA2 >
inline void build_reverse_map(const std::map<T1,T2,TP1,TA1>& map, std::map<T2,T1,TP2,TA2>& reverse_map)
{
typedef std::map<T1,T2,TP1,TA1> map_type;
for( typename map_type::const_iterator it=map.begin(),
end=map.end(); it!=end; ++it ) {
asserted_insert( reverse_map, it->second, it->first );
}
}
这段代码假设值是唯一的(如果不是,则会引发断言)。如果这不适用于您的问题,您可以轻松地更改代码以使用多重映射。
std::pair<std::string,int>
的含义。它们是否应该从地图中删除?(可能不是,因为您说您不再需要地图。但还有其他吗?) - sbi