Я работаю с списком смежности и картой, определенной с использованием следующих определений типов:
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));
...
}
Ваш код работал хорошо для меня, после исправления ошибки компиляции. Может быть, ваш компилятор не сообщает об этой ошибке, но это приводит к тому, что ваш код не работает?
Во всяком случае, ошибка в функции сравнения - вы должны получить оба параметра в качестве ссылок на const, т.е.
bool operator() (const list<Edge>& l1, const list<Edge>& l2)
Кроме того, мне пришлось переместить Local
в глобальную область действия, потому что она не работала для меня, пока она была определена внутри функции. Вы можете увидеть рабочий результат здесь: http://ideone.com/e.js/UPMeFm
Local
и, очевидно, проблема возникла из-за того, что я page_ofID
страницу из page_ofID
. Я использовал page_ofID.at(iter-lst.begin())
вместо вашего page_ofID.at(iter->front().origin);
,
sort
будет использовать это возвращаемое значение для сортировки. Должна ли моя функция изменять переданные объекты?