使用重复键对对象排序

时间:2012-04-10 22:30:06

标签: c++ list

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

Class Foo {
private:
  int rank;
}

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

知道如何在C ++中做到这一点?我在看make_heap(),但我不确定如何使用它(或者如果可以使用它)。

1 个答案:

答案 0 :(得分:1)

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

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>Foo将按rank升序排序,例如。

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'Effective STL描述了第23项中的情况。