使用更大或更少翻转地图

Flip map using greater or less

本文关键字:翻转 地图      更新时间:2023-10-16

我需要翻转地图(key => value value => key)。但是,我希望该选项按 asc/desc 顺序排序。

我认为使用或多或少!

例如:map<int, int, greater<int> > map

基于发布排序标准::地图使用值,我有部分解决方案...

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;
}

埃罗: error: default template arguments may not be used in function templates without -std=c++11 or -std=gnu++11

几乎用最后一个代码片段来拥有它,你只是忘记使用你允许的比较模板类型。

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;
}

您需要允许使用自定义比较器。 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 一起使用,并且每次都明确指定函数对象/比较器类型。