Как отметили Клатчко и GMan, функция STL дает вам именно то, что вы просите: std :: upper_bound .
Однако, если вам нужно придерживаться bsearch, простейшим решением может быть итерация вперед, пока вы не достигнете нового значения.
void* p = bsearch(key, base, num, width, compare);
while ((p != end) && // however you define the end of the array -
// base + num, perhaps?
(compare(key, p)==0)){ // while p points to an element matching the key
++p; // advance p
}
Если вы хотите получить первое p, соответствующее ключу, а не первое, которое больше, просто используйте --p
вместо ++p
.
Предпочитаете ли вы этот или повторный двоичный поиск, как предполагает Майкл, зависит от размера массива и ожидаемого количества повторений.
Теперь заголовок вашего вопроса относится к настройке функции сравнения, но, как я понимаю, вопрос, который вам здесь не поможет, - функция сравнения должна сравнивать любые два эквивалентных объекта как эквивалентные, поэтому нет смысла распознавать, какой из несколько эквивалентных объектов является первым / последним своего типа в массиве. Если у вас не было другой проблемы, в частности, касающейся функции сравнения?