binary_search in STL
От: Аноним  
Дата: 22.06.08 00:01
Оценка:
Привет пацаны! Допустим у меня есть отсортированный массив intов. Мне нужно найти элемент используя двоичный поиск. Как это сделать используя алгоритмы STL? В STL есть функция binary_search, но она возвращает bool. Мне же нужен итератор на сам элемент если таковой существует или на конечный если ничего не найдено. Было бы лучше если бы стандарт говорил чтобы возвращался итератор а не булевое значение т.к. в большинстве случаев нужно работать с самим элементом а не знать есть он или нет. Уж очень не хочется писать свой двоичный поиск. Спасибо.

Да, mapы и setы не предлагать.
Re: binary_search in STL
От: shrecher  
Дата: 22.06.08 00:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет пацаны!

Здорово, пацан!

попробуй lower_bound.
Re: binary_search in STL
От: valker  
Дата: 23.06.08 07:06
Оценка:
Попробуй std::equal_range. Он возвращает пару итераторов. Если они равны, значит объект не найден, если не равны, значит найден, и первый итератор указывает на объект.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re[2]: binary_search in STL
От: Roman Odaisky Украина  
Дата: 23.06.08 07:48
Оценка:
Здравствуйте, valker, Вы писали:

V>Попробуй std::equal_range. Он возвращает пару итераторов. Если они равны, значит объект не найден, если не равны, значит найден, и первый итератор указывает на объект.


Это лишняя работа.

В C++09 будет функция вроде
template <class ForwardIterator, class X>
ForwardIterator no_name_yet(ForwardIterator first, ForwardIterator last, X const& x)
{
    ForwardIterator const lb = (lower_bound)(first, last, x);
    return x < *lb ? last : lb;
}

которая будет возвращать итератор, если объект найден, или PTE, если не найден.
До последнего не верил в пирамиду Лебедева.
Re[3]: binary_search in STL
От: ant_katcin Россия  
Дата: 23.06.08 16:03
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, valker, Вы писали:


V>>Попробуй std::equal_range. Он возвращает пару итераторов. Если они равны, значит объект не найден, если не равны, значит найден, и первый итератор указывает на объект.


RO>Это лишняя работа.


RO>В C++09 будет функция вроде

RO>
RO>template <class ForwardIterator, class X>
RO>ForwardIterator no_name_yet(ForwardIterator first, ForwardIterator last, X const& x)
RO>{
RO>    ForwardIterator const lb = (lower_bound)(first, last, x);
RO>    return x < *lb ? last : lb;
RO>}
RO>

RO>которая будет возвращать итератор, если объект найден, или PTE, если не найден.

давно пора, а то через lower_bound не красиво
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Re[3]: binary_search in STL
От: Аноним  
Дата: 24.06.08 02:13
Оценка:
RO>Это лишняя работа.
RO>В C++09 будет функция вроде
RO>
RO>template <class ForwardIterator, class X>
RO>ForwardIterator no_name_yet(ForwardIterator first, ForwardIterator last, X const& x)
RO>{
RO>    ForwardIterator const lb = (lower_bound)(first, last, x);
RO>    return x < *lb ? last : lb;
RO>}
RO>

RO>которая будет возвращать итератор, если объект найден, или PTE, если не найден.
Спасибо ответившим. Сделал через lower_bound. Только в функции выше недочет; не учитывается что lower_bound может вернуть last.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.