我需要一个由其中一个参数排序的长对象列表。在C ++中执行此操作的最快方法是什么?我需要能够在此列表中添加和删除元素,并仍然按该特定参数进行排序。
Class Foo {
private:
int rank;
}
我希望所有Foo
个对象都按升序列出,而当添加或删除新对象时,它应该按顺序采取正确的位置。也可以有多个具有相同rank
的对象,因此无法使用键值。
知道如何在C ++中做到这一点?我在看make_heap(),但我不确定如何使用它(或者如果可以使用它)。
答案 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项中的情况。