2

假设我有一个地图,键为字符,值为整数。基于黑红树的属性,每次插入新的pair,map都会按照char排序。在所有插入之后,我想再次按它的值(即整数)对我的地图进行排序。我的问题是,我可以通过自己的比较功能来做到这一点吗?这是代码:

sort(mymap.begin(), mymap.end(), MyComp);

class MyComp
{
public:
    bool operator()(const pair<char, int>& x, const pair<char, int>& y) const
    {
        return x.second > y.second;
    }
};

我的代码无法编译,但我不知道为什么我不能这样做。谁能帮我?

此外,如果这不是解决问题的好方法,还有其他方法吗?

我可以想到一种方法是创建另一个映射并通过交换值和键再次插入,它可以工作但浪费更多空间。谢谢!

4

2 回答 2

3

您不能重新排列 a 的元素std::map<K, V>:此映射的值类型实际上是std::pair<K const, V>,因此,元素不是 Swappable 所需的std::sort()

但是,您可以通过自定义谓词std::map<...>本身来更改排序标准:

std::map<K, V, Compare> m;

但是请注意,比较函数 inCompare接受两个K const&作为参数,而不是 a std::pair<K const, V>

顺便说一句,如果您从 a 中获取元素std::map<K, V, ...>,则值类型不是 std::pair<K, V>but std::pair<K const, V>。但是,通常后一种类型会隐式转换为前一种,即,您可以调用

void f(std::pair<char, int> const&) { ... }

有一个std::pair<char const, int>

f(std::pair<char const, int>('a', 1));

但是,此操作不仅会提供对原始对象的引用,还会构造一个新对象。在设置中使用charandint这不是什么大问题,但是转换可能相当昂贵,例如,如果其中一个成员是std::string.

于 2013-11-07T22:09:14.203 回答
0

排序标准std::map仅在创建时设置一次,以后无法更改,也无法重新排列地图中的现有数据。因此,如果您需要以不同方式处理数据,您可以使用不同的容器boost::multi_index,例如支持多个自助餐厅进行排序或将数据复制到另一个容器并对其进行排序。

于 2013-11-07T22:17:11.460 回答