基于非唯一优先级值的指向自定义类型的指针的排序容器,作为类成员



我需要一个满足这种情况的容器:

  1. 需要成为一个类的成员
  2. 需要包含指向自定义类型的指针
  3. 元素使用非唯一优先级值(整数。例如:优先级为0的项目位于优先级为1的项目之前,优先级为2的项目之前。具有相同优先级的项目之间的顺序不重要(进行排序
  4. 无法使用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就足够了:

#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;
}

现场示例:https://ideone.com/iY9Jrp

最新更新