对具有重复键的对象进行排序

Sort objects with duplicate keys

本文关键字:对象 排序      更新时间:2023-10-16

我需要一长串按其中一个参数排序的对象。在C++中做到这一点的最快方法是什么?我需要能够在此列表中添加和删除元素,并且仍然按该特定参数进行排序。

Class Foo {
private:
  int rank;
}

我希望我所有的Foo对象都按升序列出,当添加或删除新对象时,它应该按顺序排列正确的位置。也可以有多个具有相同rank的对象,因此无法实现键值。

知道我如何在C++做到这一点吗?我正在查看 make_heap(),但我不确定如何将它(或是否可以与对象一起使用)。

首先,您可能应该为Foo定义operator<(类似这样)...

inline bool operator< (const Foo& lhs, const Foo& rhs) {
  return lhs.rank < rhs.rank;
} 

需要声明为Foo的朋友:

class Foo {
 public:
  explicit Foo(int rank_init) : rank(rank_init) {}
  friend bool operator< (const Foo&, const Foo&);
 private:
  int rank;
};


现在您可以创建一个std::multiset<Foo>,它将保持Foorank升序排序,例如

std::multiset<Foo> foo_multiset;
foo_multiset.insert(Foo(5));  // 5
foo_multiset.insert(Foo(3));  // 3, 5
foo_multiset.insert(Foo(1));  // 1, 3, 5
foo_multiset.insert(Foo(3));  // 1, 3, 3, 5
size_t erased_count(foo_multiset.erase(Foo(3)));  // 1, 5 (erased_count == 2)

但是,不能保证这将是您特定情况下的"最快"选项。 您需要为此进行配置文件。 根据元素的数量、插入/擦除操作的频率和 STL 实现,您会发现排序std::vector<Foo>更适合您的需求。

斯科特·迈耶斯(Scott Meyers)的有效STL在第23项中描述了这种情况。