另一種可能性是建立一個反向映射。對你而言,這將是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);
}
}
此代碼假定值是唯一的,太(並拋出一個斷言,如果不是這種情況)。如果這不適用於您的問題,您可以輕鬆更改代碼以使用多地圖。
來源
2009-09-02 13:40:35
sbi
您的要求對我來說很不明確。 IIUC,你需要在地圖上找到10個條目_而不是他們的密鑰?一旦你有他們,你會怎麼做呢?我問,因爲「摧毀」是一個模糊的術語,我無法猜測'std :: pair'的含義。他們是否被從地圖上刪除? (可能不會,因爲你說你不再需要地圖了,但還有什麼?) –
sbi
2009-09-02 12:58:22
地圖將被破壞,所以我不在乎後面會發生什麼,只需要有10個值 – 2009-09-02 12:59:04