【问题标题】:change ordering mode of std::map更改 std::map 的排序模式
【发布时间】:2012-06-20 21:18:52
【问题描述】:

我正在创建一个std::map<a,b>,其中的排序标准是用a::operator< 定义的。

有什么方法可以改变地图的类型,以便从现在开始由a 上的另一个排序算法排序?它也需要重新排序地图的当前内容。

【问题讨论】:

  • 严格来说std::map<a,b>的排序是由std::less<a>定义的。
  • @Robᵩ,如果你没有专门化std::less<a>,它会调用a::operator<,所以你都是对的。

标签: c++ stl stdmap


【解决方案1】:

您必须创建另一个地图,并将第一个地图的元素复制到第二个地图中,如下所示:

std::map<a,b> map1;
... // operations on map1
std::map<a,b,Sorter> map2(map1.begin(), map1.end());

【讨论】:

  • 那么我想我不能将 map1 换成 map2,因为它们有不同的类型?对我来说没关系,只是出于好奇而想知道......
  • @lezebulon,你不能交换它们。内部数据表示取决于比较函数,因此即使声明允许它也不实用。
【解决方案2】:

答案在于std::map的声明

template < class Key, class T, class Compare = less<Key>,
           class Allocator = allocator<pair<const Key,T> > > class map;

Compare 模板参数可用于定义地图排序的比较:

Compare:比较类:接受两个 key 参数的类 输入并返回一个布尔值。表达式 comp(a,b),其中 comp 是 此比较类的对象,a 和 b 是键值,应 如果将 a 放置在 a 中比 b 更早的位置,则返回 true 严格的弱排序操作。这可以是一个类 实现函数调用运算符或指向函数的指针(参见 构造函数为例)。这默认为 less,返回 与应用小于运算符 (a

我从here引用了这个

【讨论】:

  • 这并不能直接回答问题。我可以传入一个实现operator()() 的有状态类,其中行为取决于函子对象的其他成员,并且仍然符合您提到的所有内容。现在,在至少调用一次operator()() 之后实际更改影响排序的数据将违反严格的弱排序要求。但这从您的回答中非常不清楚。
  • @BenVoigt 我不明白你在说什么。 OP 询问他如何将新的排序应用于他的地图。要应用另一个排序,您可以使用 Compare 模板参数。我没看到问题???
  • 你不能改变一个对象的模板参数,它是编译时类型的一部分并且被嵌入。
猜你喜欢
  • 2013-05-08
  • 2015-12-04
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
相关资源
最近更新 更多