我需要翻转地图(key => value
中的value => key
)。但是,我希望选项以asc / desc顺序排序。
我认为使用更多或更少!
例如:map<int, int, greater<int> > map
基于发布Sorting std::map using value,我有部分解决方案......
template<typename A, typename B>
pair<B, A> flipPair(const pair<A, B> &p) {
return pair<B,A>(p.second, p.first);
}
template<typename A, typename B>
map<B, A> flipMap(const map<A, B> &src) {
map<B, A> dst;
transform(src.begin(), src.end(), inserter(dst, dst.begin()), flipPair<A, B>);
return dst;
}
如何添加参数以选择更大或更小?
我试过这个但是没有用!!
template<typename A, typename B, typename Comp = less<A> >
map<B, A, Comp> flipMap(const map<A, B> &src) {
map<B, A, Comp> dst;
transform(src.begin(), src.end(), inserter(dst, dst.begin()), flipPair<A, B>);
return dst;
}
Erro:error: default template arguments may not be used in function templates without -std=c++11 or -std=gnu++11
答案 0 :(得分:2)
您几乎将其与您的上一个代码段相关联,您只是忘记使用您允许的比较模板类型。
template<typename A, typename B, typename Compare = less<A> >
map<B, A, Compare> flipMap(const map<A, B> &src)
{
map<B, A, Compare> dst;
transform(src.begin(), src.end(), inserter(dst, dst.begin()), flipPair<A, B>);
return dst;
}
答案 1 :(得分:1)
您需要允许使用自定义比较器。 std::map
根据告知使用的比较器对键进行排序。默认情况下,它是std::less
,后者又使用operator <
作为密钥类型。要使用其他比较器,可以将其添加到函数的参数列表中,并在新的map
构造函数中指定它:
template<typename A, typename B, typename Comp = std::less<B> >
map<B, A, Comp> flipMap(const map<A, B> &src, const Comp& comp = Comp()) {
map<B, A> dst(comp);
transform(src.begin(), src.end(), inserter(dst, dst.begin()), flipPair<A, B>);
return dst;
}
这种方式提供合理的默认行为,并允许通过比较器进行任意定制(如有必要)。要获得逆序,请使用std::greater
作为比较器:
std::map<B, A> flippedDesc = flipMap(original, std::greater<B>());
注意:由于默认的函数模板参数,上面的代码是C ++ 11。只要删除= std::less<B>
,您仍然可以将它与C ++ 03一起使用,并且每次都明确指定函数对象/比较器类型。