C ++ - сортировка с дополнительным параметром

0

Я работаю с списком смежности и картой, определенной с использованием следующих определений типов:

typedef vector<list<Edge> > adjacencyList;
typedef map<int,WikiPage> idToWikiMap;

Я хотел бы отсортировать список adjacencyList (adjacencyList) по имени. Индекс adjacencyList отображается на пару на моей карте. Например,

adjacencyList lst;

lst[0] = NULL
lst[1] = list of edges related to City1
lst[2] = list of edges related to City2

idToWikiMap mymap;

mymap[1] -> Name of City1
mymap[2] -> Name of City2

Поэтому я хочу отсортировать список смежности, используя имя на карте, связанную с индексом списка смежности. Я придумал следующий код. Поскольку моей функции сравнения требуется карта, я не могу просто создать нормальную функцию. Поэтому я использовал struct и Local.

Сравнительные работы. Я могу cout имя списков, которые в настоящее время сравниваются, и возвращаемое значение. Например, я получаю

Comparing Chicago and  New York
Smaller: 0
Comparing Montreal and  Chicago
Smaller: 1
Comparing Montreal and  New York
Smaller: 0
Comparing Toronto and  Chicago
Smaller: 1
Comparing Toronto and  Montreal
Smaller: 1
Comparing Toronto and  New York
Smaller: 1
Comparing Miami and  Chicago
Smaller: 1
Comparing Miami and  Montreal
Smaller: 0

Однако оригинал не изменяется. Я сделал что-то неправильно?

  void printOrganized(adjacencyList& lst, idToWikiMap page_ofID) {
  // Define compare functions that accepts idToWikiMap parameter
  struct Local {
    Local(idToWikiMap mymap) { this->mymap = mymap; }

    bool operator() (const list<Edge>& l1, list<Edge>&l2)
    { return mymap.at(l1.front().origin).title < mymap.at(l2.front().origin).title; }

    idToWikiMap mymap;
  };

  /* Sort adjacenyList lst */
  sort (lst.begin()+1, lst.end(), Local(page_ofID));

  ...
  }
  • 0
    Возвращенные значения, но оригинал никогда не перезаписывается. Вы передаете по ссылке, но затем не делаете назначения.
  • 0
    @OllieFord, я думал, что функция сравнения просто возвращает истину / ложь для двух объектов, и алгоритм sort будет использовать это возвращаемое значение для сортировки. Должна ли моя функция изменять переданные объекты?
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ

Ваш код работал хорошо для меня, после исправления ошибки компиляции. Может быть, ваш компилятор не сообщает об этой ошибке, но это приводит к тому, что ваш код не работает?

Во всяком случае, ошибка в функции сравнения - вы должны получить оба параметра в качестве ссылок на const, т.е.

bool operator() (const list<Edge>& l1, const list<Edge>& l2)

Кроме того, мне пришлось переместить Local в глобальную область действия, потому что она не работала для меня, пока она была определена внутри функции. Вы можете увидеть рабочий результат здесь: http://ideone.com/e.js/UPMeFm

  • 0
    Спасибо за тестирование кода PaF! Я взглянул на вашу обертку вокруг Local и, очевидно, проблема возникла из-за того, что я page_ofID страницу из page_ofID . Я использовал page_ofID.at(iter-lst.begin()) вместо вашего page_ofID.at(iter->front().origin); ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню