Как я могу отсортировать список указателей на C ++? - PullRequest
0 голосов
/ 17 мая 2018

Я должен отсортировать список указателей так:

list< pair< MyClass*,double> * > * myList

код myClass:

class MyClass {
    private: 
        int id;
    public: 
        MyClass(int id){ 
            this.id=id;}
        ///...
    }

Поэтому я должен заказать myList до увеличения идентификатора MyClass . Пример : Если у меня есть

pair<MyClass*,double> * pair1=new pair<MyClass*,double>(new MyClass(1),1.0);
pair<MyClass*,double> * pair2=new pair<MyClass*,double>(new MyClass(2),1.0);
pair<MyClass*,double> * pair3=new pair<MyClass*,double>(new MyClass(3),1.0);

и я добавляю, по порядку пара2, пара3, пара1 к myList, после алгоритма сортировки Я хочу пару1, пару2, пару3 в myList.

Можно ли сделать это без реализации алгоритма сортировки вручную?
Спасибо за ответ: D

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

std::list::sort() может принимать пользовательские функции сравнения. Просто напишите:

myList.sort([](const auto& p1, const auto& p2) {
    return *p1->first < *p2->first;
});

Это необходимо operator<(MyClass, MyClass), чтобы определить:

class MyClass
{
    /* ... */
    friend bool operator<(MyClass const& lhs, MyClass const& rhs) { return lhs.id < rhs.id; }
 };
0 голосов
/ 17 мая 2018

Это слишком много указателей, я должен сказать. Простое std::list< std::pair<MyClass,double>> myList; прекрасно и избавит вас от головной боли, когда придет время выследить и уничтожить все объекты.

Теперь сортировка. Конечно:

#include <algorithmh>

...

class MyClass {
    ...
public:
    int getId() const { return id; }
    ...
};

bool my_compare(const std::pair< MyClass*,double> *& lhs, const std::pair< MyClass*,double> *& rhs) {
    return lhs->first->getId() < rhs->first->getId();
}

, затем позвоните

myList->sort(my_compare);
0 голосов
/ 17 мая 2018

Используйте std::list::sort с пользовательской двоичной функцией сравнения, аналогичной:

bool cmp(const pair< MyClass*,double> * &a, const pair< MyClass*,double> * &b)
{
    return a->first->getID() < b->first->getID();
}

Тогда:

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