使用更大或更小的翻转地图

时间:2013-09-11 14:26:05

标签: c++

我需要翻转地图(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

2 个答案:

答案 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一起使用,并且每次都明确指定函数对象/比较器类型。