2014-03-18 6 views
1

Я пытаюсь измерить количество сравнений, используемых различными алгоритмами поиска. Мой код довольно прост - данный вектор объектов, то я называю std::sort(students.begin(), students.end());Реализация std :: sort Правильно

Я выполнил оператор сравнения в моем классе Student так:

bool Student::operator < (Student s) const { 
    compareCount++; 
    return number < s.getNumber(); 
} 

где compareCount является статической переменной. Однако мои результаты озадачивают.

enter image description here

Почему std::sort требуется два сравнивает для списка из двух элементов? Это заставляет меня думать, что некоторая часть моего кода неверна.

+4

Это не очень понятно, что заставляет вас путать с результатами. – lisyarus

+0

Что озадачивает? – zneak

+0

Для экспериментов используйте гораздо больший размер. Например, 10000, 100000 или 1000000. 8 слишком мала. – timrau

ответ

1

«Зачем std :: sort требует два сравнения для двухэлементного списка?» - Это было сделано в режиме «отладки»? Я тестировал это с помощью Visual Studio 2005 - который использует сортировку вставки для небольших массивов (размер < 32, в противном случае он использует сортировку быстрой сортировки или кучи). В режиме «release» он сравнивается. В режиме отладки, он проверяет звонящий поставляется сравнить процедуру, чтобы убедиться, что это < < в сравнении =, так что есть два звонки:

{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering 
if (!_Pred(_Left, _Right)) 
    return (false); 
else if (_Pred(_Right, _Left)) 
    _DEBUG_ERROR2("invalid operator<", _Where, _Line); 
return (true); 
} 
Смежные вопросы