1

我需要翻转地图(key => valuein 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;
}

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

4

2 回答 2

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;
}
于 2013-09-11T14:34:00.040 回答
1

您需要允许使用自定义比较器。std::map根据告诉它使用的比较器对键进行排序。默认情况下,它是std::less,它又operator <用于键类型。为了使用其他比较器,您可以将其添加到函数的参数列表中并在 newmap的构造函数中指定它:

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

于 2013-09-11T14:28:20.903 回答