Проблема с алгоритмом сортировки и указателями объектов - PullRequest
1 голос
/ 10 марта 2019

У меня есть объект, содержащий некоторые данные, такие как:

class Employee{
    private:
         int employee_number;
         // +more objects and data
    public:
        int get_number() {
            return employee_number;
        }
};

Объекты хранятся в массиве указателей:

Employee* employees[MAX + 1];

Первый элемент в Employee не используется, поэтомуалгоритм пропускает сотрудников [0]

алгоритм сортировки вызывается при каждом добавлении нового сотрудника, вот как выглядит алгоритм сортировки:

int to = employees.length - 1;
for (int from = 1; from < to; from++) {
    if (employees[from]->get_number() > employees[from + 1]->get_number()) {
        Employee *tmp = employees[from + 1];
        int i = from;

        while (i >= 1 && employees[i]->get_number() > tmp->get_number()) {
            employees[i + 1] = employees[i];
            i--;
        }

        employees[i + 1] = tmp;
    }
}

Я не уверенпочему это не сортирует массив сотрудников, так как этот алгоритм хорошо работает с обычными массивами int.Также имейте в виду, что весь мой код написан на моем родном языке, поэтому мне пришлось перевести на английский здесь.

1 Ответ

0 голосов
/ 11 марта 2019

Предполагая, что вы хотите отсортировать указатели Employee в порядке возрастания по элементу данных employee_number (т. Е. Ключ employee_number) объектов, на которые они указывают, вы можете определить следующий предикат, используялямбда-выражение:

auto cmp = [](auto a, auto b) {
   return a->get_number() < b->get_number();
};

Затем используйте алгоритм std::sort() с указанным выше предикатом:

auto begin = &employees[1]; // skip 1st element
std::sort(begin, employees + num, cmp);

, где num выше - 1 (так как вы сказали, что первая запись не используется) плюс количество Employee указателей, вставленных до сих пор.


Я не совсем уверен, чего вы хотите достичь, но если у вас есть намерениевызова std::sort() для массива каждый раз, когда в массив добавляется новый Employee, вы можете рассмотреть возможность использования другого контейнера, например std::set вместо массива.

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