Я пытаюсь отсортировать вектор объектов, используя функцию предиката, и получаю некоторые ошибки ...
У меня есть класс Item
и список элементов в vector< Item > _items
,Мне нужно было отсортировать его в соответствии с порядком отображения (числовой член класса), и я просто вызвал простую сортировку с функцией предиката.
sort(_items.begin(), _items.end(), sort_item_by_display_order);
, где функция предиката -
bool sort_item_by_display_order (Item i, Item j)
{
return i.GetDisplayOrder()>j.GetDisplayOrder();
}
и GetDisplayOrder равен
int Item::GetDisplayOrder()
{
return display_order;
}
, но ... при этом я получил некоторые ошибки.Затем я добавил счетчик в функцию предиката, чтобы проверить, сколько раз он вызывался, и обнаружил, что при сбое счетчик был больше, чем размер вектора.
После некоторого чтения я изменил код для использованияитераторы вместо использования .begin () и .end () (разве это не должно быть одинаково?!)
Итак, теперь у меня есть
vector<Item>::iterator it_start, it_end;
it_start = _items.begin();
it_end = _items.end();
sort(it_start, it_end, sort_item_by_display_order);
с тем же предикатомfunction.
И теперь он не падает, но ... для большей части сортировки я получаю больше итераций, чем размер вектора, который я сортирую (что, вероятно, нормально)
Итак ... В чем разница между сортировкой вызовов с _items.begin()
или _it_start
.Из того, что я могу сказать, они одинаковы, верно?!
Еще одна заметка.Item
- это простой базовый класс, объявленный как
class Item
{
private:
(...)
public:
(...)
}
. В качестве ссылки я использовал http://www.cplusplus.com/reference/algorithm/sort/ и http://www.codeguru.com/forum/showthread.php?t=366064.
Во второй ссылке они добавляют const и & toаргументы предикатной функции, которые делают мою функцию примерно такой:
bool sort_item_by_display_order (const Item& i, const Item& j)
{
return i.GetDisplayOrder()>j.GetDisplayOrder();
}
, но я получаю ошибку компилятора:
Item.cpp|1485|error: passing `const Item' as `this' argument of `int Item::GetDisplayOrder()' discards qualifiers|
arghhh ... Вопрос в том ... Что яделаешь неправильно?