首页 > 解决方案 > 基于非唯一优先级值的自定义类型指针的排序容器,作为类成员

问题描述

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

  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

我希望我可以使用一个集合,但它的关联性给我带来了麻烦,因为我的比较函数适用于排序,但不适用于唯一性(对于集合成员资格)。我想我可以在每次插入后使用向量和顺序,但我可以做一些更好的事情。据我所知,没有非关联排序容器。

标签: c++data-structuresc++17std

解决方案


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

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


推荐阅读