对具有重复键的对象进行排序
Sort objects with duplicate keys
我需要一长串按其中一个参数排序的对象。在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>
,它将保持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)的有效STL在第23项中描述了这种情况。
相关文章:
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 对象接收堆栈溢出异常 c++ 的排序向量
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 排序谓词没有传递对索引对象的引用?
- 使用指针指向对象C++对向量进行排序
- 按类成员的顺序对包含类对象的C++向量进行排序
- 无法使用接口类型对priority_queue中的对象进行排序<T>
- 基于不同字段的对象向量的排序功能
- 基于3个对象的自定义排序
- 尝试使用比较运算符对对象向量进行排序
- C++排序的对象集
- 从文件中读取并将其内容放入对象数组中,然后对它们进行排序
- q排序类对象的列表
- std::atexit 从全局对象的构造函数调用时的排序
- 尝试对对象数组进行排序时程序终止
- std::排序为排序自定义对象时出现的向量引发错误
- 通过其char键对对象指针的C 向量进行排序
- 排序算法,使用模板按内部数据对对象进行排序
- 在对象向量中的对象字段排序
- 如何使用 std::sort 对数组中的特定对象进行排序