Проблема сортировки списка указателей - PullRequest
4 голосов
/ 05 декабря 2010

я пытаюсь отсортировать список указателей (в моем случае каждый указатель имеет тип Job) Мое намерение состоит в том, чтобы отсортировать работы по их серийному номеру

void Container::jobSort(list<Job*> &jobs) {
    sort(jobs.begin(), jobs.end(), jobSerialCompare);
 }

bool Container::jobSerialCompare(const Job *jobA,const Job *jobB) {

   return (jobA->getSn()<jobB->getSn());
 }

ошибка, которую я получаю:

error: no matching function for call to 'sort(std::_List_iterator<Job*>, std::_List_iterator<Job*>, <unresolved overloaded function type>)'
/usr/include/c++/4.2.1/bits/stl_algo.h:2852: note: candidates are: void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<Job*>, _Compare = bool (Container::*)(const Job*, const Job*)]
make: *** [src/Container.o] Error 1

Мне удалось устранить ошибку, изменив код следующим образом:

struct compare {
  bool operator()(const Job *jobA, const Job *jobB) {    return (jobA->getSn()<jobB->getSn());
 }
};

 void Container::jobSort(list<Job*> &jobs) {
    jobs.sort(compare());
 }

сейчас нет ошибки компиляции, но мне интересно, что не так с моими начальными шагами, помощь приветствуется, веселит

РЕДАКТИРОВАТЬ - Большое спасибо за помощь всем! все разные ответы помогли нарисовать более четкую картину

Ответы [ 3 ]

3 голосов
/ 05 декабря 2010

В сообщении об ошибке все сказано.Вы пытаетесь отсортировать список с помощью метода sort (), который ожидает итераторы с произвольным доступом.List поддерживает только двунаправленные итераторы, поэтому автономная sort () не работает.Вот почему вы должны использовать определенные алгоритмы для списков: list.sort();

Также другие заметили проблему нестатического компаратора, которая не связана с полученным вами сообщением (но все еще должна быть исправлена).

2 голосов
/ 05 декабря 2010

В первом случае Container::jobSerialCompare является функцией-членом. Вы должны преобразовать функцию-член в объект функции с функцией mem_fun, чтобы использовать ее с sort. Попробуйте написать

#include <functional>
...
void Container::jobSort(list<Job*> &jobs) {
sort(jobs.begin(), jobs.end(), mem_fun(&Container::jobSerialCompare));

}

2 голосов
/ 05 декабря 2010

в вашей первой версии Container::jobSerialCompare является функцией-членом, поэтому он имеет неявный первый параметр this, и поэтому он не соответствует тому, что ожидает std::sort().Чтобы решить эту проблему, нужно либо определить функцию в глобальной области видимости, либо определить функтор, т. Е. Класс с operator()(), как вы это сделали.

EDIT: ... или использовать mem_fun как предлагает ВинС

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