2011-12-20 2 views
0

Я пытаюсь перейти по ссылке, где кто-то пытается упростить ссылку на сортировку на C++ http://www.cplusplus.com/forum/beginner/4817/, однако я не могу получить операционную функцию bool, чтобы скомпилировать способ, которым он обладает.Сортировка вектора объектов с помощью функции сравнения

У меня есть вектор объектов событий. Я хочу отсортировать вектор, основанный на времени начала события. Если начальное время было числом, это было бы проще, но они были строками, поэтому мне пришлось писать функции для преобразования в uint64_t, весь мой код до этой попытки работает так, как должен. Вот код, который я пытаюсь получить работу:

Функция BOOL:

bool EWriter:: operator() (Event &a, Event &b){ 
    return (stringToTime(stringReturnWrap(a.getBeginTime())) < stringToTime(stringReturnWrap(b.getBeginTime()))); 
} 

Этот код компилируется, но я не могу понять, как дать ему имя, и поэтому я не могу ссылаться на него в вид. Кроме того, я предпочел бы перегрузить оператор <, но я все равно получаю сообщение об ошибке, которому нужен третий аргумент.

Вот мой род:

sort(events->begin(), events->end(), someFunctionName);?? 

Немного не связаны, что я знаю, что я должен использовать сопзЬ в аргументах, но я не могу назвать функции класса Event, если я их реализации.

+2

Вы забыли добавить 'const'-Несс к вашему' Событие & a' и 'Event & b'? – dasblinkenlight

+0

'Событие :: getBeginTime()' должно быть объявлено 'const'. Если это не ваш код, возможно, вы можете заставить автора исправить это. Если это ваш код, исправьте его! 8v) –

ответ

2

При перегрузке operator() вы сделали EWriter a functor.

Просто передайте ему экземпляр EWriter.

Если EWriter имеет конструктор по умолчанию, вы можете использовать:

sort(events->begin(), events->end(), EWriter()); 

Или передать ему EWriter, что уже существует.

+0

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

0

Вы перегружать круглые скобки оператора:

bool EWriter:: operator() (Event &a, Event &b){ 
    return (stringToTime(stringReturnWrap(a.getBeginTime())) < stringToTime(stringReturnWrap(b.getBeginTime()))); 

}

Попробуйте с:

bool EWriter:: operator <(Event &a, Event &b){ 
    return (stringToTime(stringReturnWrap(a.getBeginTime())) < stringToTime(stringReturnWrap(b.getBeginTime()))); 

}

+0

Я пробовал это, компилятор продолжал говорить мне, что мне нужен третий arg – Miek

+0

Ответ, который был удален, сказал, чтобы сделать функцию в основном похожей на то, что вы только называете ее, сравниваете и удаляете оператор перегружать все вместе. то векторная сортировка будет std :: sort (eventVentor.begin(), eventVector.end, compare). Это имело смысл, но я расстроился и написал вид пузыря, который, кажется, работает. Спасибо за помощь – Miek