C++ 我以后是否可以更改C+;中地图的排序条件+;?

C++ 我以后是否可以更改C+;中地图的排序条件+;?,c++,map,compare,C++,Map,Compare,假设我有一个映射,键是char,值是integer。基于黑-红树的特性,每次我插入一对新的映射,映射将按字符排序。在所有的插入之后,我想再次按其值(即整数)对地图进行排序。我的问题是,我可以通过我自己的比较函数来实现吗?下面是代码: sort(mymap.begin(), mymap.end(), MyComp); class MyComp { public: bool operator()(const pair<char, int>& x, const pair&

假设我有一个映射,键是char,值是integer。基于黑-红树的特性,每次我插入一对新的映射,映射将按字符排序。在所有的插入之后,我想再次按其值(即整数)对地图进行排序。我的问题是,我可以通过我自己的比较函数来实现吗?下面是代码:

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;
    }
};
排序(mymap.begin(),mymap.end(),MyComp); 类mycop { 公众: 布尔运算符()(常数对&x,常数对&y)常数 { 返回x秒>y秒; } };
我的代码不能编译,但我不知道为什么我不能这样做。有人能帮我吗 此外,如果这不是解决问题的好方法,还有其他方法吗?我可以想出一种方法,即创建另一个地图,然后通过交换值和键再次插入,它可以工作,但会浪费更多的空间。谢谢

您无法重新排列
std::map
的元素:此映射的值类型实际上是
std::pair
,因此,元素不能按照
std::sort()
的要求进行交换

但是,您可以通过自定义
std::map
本身的谓词来更改排序条件:

std::map<K, V, Compare> m;
使用
std::pair

f(std::pair('a',1));

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

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

地图实例化后,您不能更改其排序标准,但是您可以使用自己的排序函子来构造它。我不想更改它的排序条件,我只想添加另一个我自己的排序并再次应用于它。在映射被实例化后,您无法对其进行排序。映射在每次插入时都会自动排序。您必须对每个元素重新排序,还可以将它们以正确的排序顺序移动到新映射。
void f(std::pair<char, int> const&) { ... }
f(std::pair<char const, int>('a', 1));