Пользовательский класс сравнения не работает, как я ожидаю, для указателей на определенный пользователем класс в контейнере std :: set - PullRequest
0 голосов
/ 01 ноября 2019

Я не могу понять, почему в этом примере кода контейнер std :: set не упорядочивает сущности, как я ожидаю, на основе определенного мной класса сравнения. Кто-нибудь может мне помочь, пожалуйста? Спасибо

 #include <iostream>
 #include <set>

 class Entity {
 public:
 int num;
 Entity(int num):num(num){}
     bool operator< (const Entity& _entity) const { return (this->num < _entity.num); }
 };

 struct my_cmp {
     bool operator() (const Entity* lhs, const Entity* rhs) const { return (lhs < rhs); }
 };

 class EntityManager {
     private:
        std::set<Entity*, my_cmp> entities;
   public:
        void AddEntity(int num) { entities.insert(new Entity(num)); }
        void ListAllEntities() const {
              unsigned int i = 0; 
              for (auto& entity: entities) {
                  std::cout << "Entity[" << i << "]: num:" << entity->num << std::endl;
                  i++;
              }
         }
};

int main(void) {
    EntityManager manager;
    manager.AddEntity(2);
    manager.AddEntity(1);
    manager.AddEntity(4);
    manager.AddEntity(3);
    manager.ListAllEntities();
    return 0;
}

Вывод:

Entity [0]: num: 2

Entity [1]: num: 1

Entity[2]: num: 4

Entity [3]: num: 3

Вместо этого можно ожидать следующий вывод:

Entity [1]: номер: 1

Объект [0]: номер: 2

Объект [3]: номер: 3

Объект [2]: номер: 4

1 Ответ

0 голосов
/ 01 ноября 2019

Вам нужно разыменовать ваши указатели *lhs < *rhs. Вы просто сравниваете значения указателей в настоящее время, поэтому ваш заказ зависит от их расположения в памяти.

#include <iostream>
 #include <set>

 class Entity {
 public:
 int num;
 Entity(int num):num(num){}
     bool operator< (const Entity& _entity) const { return (this->num < _entity.num); }
 };

 struct my_cmp {
     bool operator() (const Entity* lhs, const Entity* rhs) const { return (*lhs < *rhs); }
 };

 class EntityManager {
     private:
        std::set<Entity*, my_cmp> entities;
   public:
        void AddEntity(int num) { entities.insert(new Entity(num)); }
        void ListAllEntities() const {
              unsigned int i = 0; 
              for (auto& entity: entities) {
                  std::cout << "Entity[" << i << "]: num:" << entity->num << std::endl;
                  i++;
              }
         }
};

int main(void) {
    EntityManager manager;
    manager.AddEntity(2);
    manager.AddEntity(1);
    manager.AddEntity(4);
    manager.AddEntity(3);
    manager.ListAllEntities();
    return 0;
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...