c++ - 基于非唯一优先级值的自定义类型指针的排序容器,作为类成员
问题描述
我需要一个满足这种情况的容器:
- 需要成为班级成员
- 需要包含指向自定义类型的指针
- 元素使用非唯一的优先级值(整数。例如:优先级 0 的项目排在优先级 1 的项目之前,优先级 2 的项目之前。相同优先级的项目之间的顺序不重要)
- 不能使用 boost 或任何其他外部库
可选地,如果我不必创建额外的类/结构来支持排序,那就太好了。此外,C++ 17 也不错。
请注意,我使用的是 ( auto item : collection
),但如果这只适用于传统的迭代器,那也没关系。
例如:
class MyBigClass {
Collection<Item*> myItems;
void MyMain();
}
class Item {
std::string data;
int priority;
}
void MyBigClass::MyMain()
{
Item i1("data1", 1);
Item i2("data2", 0);
Item i3("data3", 3);
Item i4("data4", 1);
myItems.insert(&i3);
myItems.insert(&i1);
myItems.insert(&i2);
myItems.insert(&i4);
for(auto item : myItems) {
cout << item->data << endl;
}
}
// expected output
// data2
// data1
// data4
// data3
我希望我可以使用一个集合,但它的关联性给我带来了麻烦,因为我的比较函数适用于排序,但不适用于唯一性(对于集合成员资格)。我想我可以在每次插入后使用向量和顺序,但我可以做一些更好的事情。据我所知,没有非关联排序容器。
解决方案
std::multiset
具有自定义比较功能的 A就足够了:
#include <iostream>
#include <string>
#include <set>
using namespace std;
struct Item {
std::string data;
int priority;
};
struct item_compare
{
bool operator()(Item* lhs, Item* rhs)
{
return lhs->priority < rhs->priority;
}
};
int main() {
std::multiset<Item*, item_compare> item_set;
Item i1{"data1", 1};
Item i2{"data2", 0};
Item i3{"data3", 3};
Item i4{"data4", 0};
Item i5{"data5", 0};
item_set.insert(&i1);
item_set.insert(&i2);
item_set.insert(&i3);
item_set.insert(&i4);
item_set.insert(&i5);
for(auto item : item_set)
std::cout << item->data << '\n';
return 0;
}
推荐阅读
- git - 拉不出来master怎么改一段代码?
- google-chrome - chrome 开发人员工具 - 取消停靠源选项卡
- angular - Angular 6:使用 Karma 对异步文件导入进行单元测试
- http - 什么是有效的 RFC1123 日期格式
- telegram - 将 TelegramDesktop 配置文件转换为 telegram-cli
- javascript - AJAX 不发送数据,我不能使用 POST Result
- javascript - Angular 绑定中的 Unicode 字符
- java - 如何排除 IntelliJ 中的不安全删除?
- java - 为什么我们需要在 PACT 测试中进行单元测试?
- vb.net - 在每个循环中跳过一行,并带有一个排好序的列