Алгоритм found
От: igna Россия  
Дата: 13.10.09 09:17
Оценка:
Нередко алгоритм std::find используется не для того, чтобы действительно найти некоторый элемент, а только для того, чтобы узнать, есть такой элемент или нет:

    if (find(begin, end, value) == end)


То есть подошел бы позволяющий более короткую запись алгоритм found:

    if (found(begin, end, value))


Ни в стандартной библиотеке, ни в Boost'е алгоритма found нет.

Вопросы:


PS. Собственно мое мнение таково: определяя алгоритм возвращающий найденный элемент или конец последовательности в случае, если элемент не был найден, нужно определять соответствующий ему алгоритм возвращающий true, если элемент существует, и false в противном случае. Это как, к примеру, перегрузка по std::string const& и char const*, хотя аналогия конечно тут непрямая. Но мнение мое не важно, вопросы вверху.
Re: Алгоритм found
От: dcb-BanDos Россия  
Дата: 13.10.09 09:39
Оценка:
Здравствуйте, igna, Вы писали:

пишу if (find(begin, end, value) == end), found не пишу, так как для меня это мало отличается от if (find(begin, end, value))
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: Алгоритм found
От: XuMuK Россия  
Дата: 13.10.09 09:41
Оценка:
Здравствуйте, igna, Вы писали:

I>Вопросы:


I>

1. 0, в случаях когда был нужен found, оказывалось разумнее отсортировать последовательность и использовать std::binary_search, либо вообще заменить коллекцию на std::set/std::map/boost::multi_index_array
2. нет
3. нет
Re: Алгоритм found
От: Кодт Россия  
Дата: 13.10.09 09:47
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Нередко алгоритм std::find используется не для того, чтобы действительно найти некоторый элемент, а только для того, чтобы узнать, есть такой элемент или нет:


Ну не знаю насчёт "нередко". Обычно, когда я что-то ищу, я предполагаю это использовать.

I>То есть подошел бы позволяющий более короткую запись алгоритм found:

I>
I>    if (found(begin, end, value))
I>


I>Ни в стандартной библиотеке, ни в Boost'е алгоритма found нет.

Две секунды написать
template<class It, class Value> bool found   (It i, It j, Value v) { return std::find   (i,j,v)!=j; }
template<class It, class Pred>  bool found_if(It i, It j, Pred p)  { return std::find_if(i,j,p)!=j; }


Вообще, ни STL, ни boost не являются законченными библиотеками на все случаи жизни. Они предоставляют неплохой базис.
Если какой-то специальный фокус ты проделываешь больше одного раза — заводишь себе библиотеку my_cpp_utils и складываешь эти фокусы туда для повторного использования.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re: Алгоритм found
От: Bell Россия  
Дата: 13.10.09 09:57
Оценка:
Здравствуйте, igna, Вы писали:

I>Нередко алгоритм std::find используется не для того, чтобы действительно найти некоторый элемент, а только для того, чтобы узнать, есть такой элемент или нет:


I>
I>    if (find(begin, end, value) == end)
I>


I>То есть подошел бы позволяющий более короткую запись алгоритм found:


I>
I>    if (found(begin, end, value))
I>


I>Ни в стандартной библиотеке, ни в Boost'е алгоритма found нет.


I>Вопросы:


I>
Любите книгу — источник знаний (с) М.Горький
Re[2]: Алгоритм found
От: AndrewJD США  
Дата: 13.10.09 10:32
Оценка:
Здравствуйте, XuMuK, Вы писали:


XMK>1. 0, в случаях когда был нужен found, оказывалось разумнее отсортировать последовательность и использовать std::binary_search, либо вообще заменить коллекцию на std::set/std::map/boost::multi_index_array


Если элементов очень мало и сравнение дешовое — выгоднее перебрать все элементы, вместо поддержки сортировки
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[3]: Алгоритм found
От: XuMuK Россия  
Дата: 13.10.09 14:59
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Если элементов очень мало и сравнение дешовое — выгоднее перебрать все элементы, вместо поддержки сортировки


я в курсе, но последний раз когда встретил такой подход, заменил std::vector на std::set и получил в ряде случаев 20ти кратный прирост производительности

Хотя, если брать в расчет не только алгоритм find, но и метод find, то примерно в 50% случаев пишу Collection.find(key) != Collection.end(), о том чтобы сделать свой метод, или вместо find использовать count мыслей не возникало.
Re: Алгоритм found
От: zaufi Земля  
Дата: 13.10.09 15:10
Оценка: +1
Здравствуйте, igna, Вы писали:

I>
I>    if (find(begin, end, value) == end)
I>


I>То есть подошел бы позволяющий более короткую запись алгоритм found:


наверное таки лучше его назвать exists или is_exists если уж так хочется такую функциональность...

I>Вопросы:


I>

I>PS. Собственно мое мнение таково: определяя алгоритм возвращающий найденный элемент или конец последовательности в случае, если элемент не был найден, нужно определять соответствующий ему алгоритм возвращающий true, если элемент существует, и false в противном случае. Это как, к примеру, перегрузка по std::string const& и char const*, хотя аналогия конечно тут непрямая. Но мнение мое не важно, вопросы вверху.


как правило если речь идет о контейнерах с большим числом элементов то я использую либо ассоциативные контейнеры из std либо boost::multi_index_container и соответственно использую метод соответствующего класса. искать чего либо в контейнере с малым числом элементов мне не както обычно не нужно... как правило они временное хранилище (очереди) или буфера для чегото большего...
Re[2]: Алгоритм found
От: igna Россия  
Дата: 13.10.09 15:30
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>наверное таки лучше его назвать exists или is_exists если уж так хочется такую функциональность...


is_exists на русский как перевести?
Re[3]: Алгоритм found
От: GarikTot  
Дата: 13.10.09 15:43
Оценка:
I>is_exists на русский как перевести?
is exists? <==> существует?
Re[4]: Алгоритм found
От: igna Россия  
Дата: 13.10.09 15:54
Оценка:
Здравствуйте, GarikTot, Вы писали:

GT>is exists? <==> существует?


Надо же. А is_is_exists?
Re[5]: Алгоритм found
От: GarikTot  
Дата: 13.10.09 16:01
Оценка:
I>Надо же. А is_is_exists?
Я могу ошибаться, но...
exist — глагол: "существовать"
is exists — вопрос: "существует ли?"
хотя я не настаиваю
Re[6]: Алгоритм found
От: igna Россия  
Дата: 13.10.09 16:17
Оценка: +1
Здравствуйте, GarikTot, Вы писали:

GT>is exists — вопрос: "существует ли?"


"does exist" или "is existing"
Re[3]: Алгоритм found
От: Vamp Россия  
Дата: 13.10.09 16:39
Оценка:
I>is_exists на русский как перевести?
Я полагаю, имелся в виду if_exists
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Алгоритм found
От: igna Россия  
Дата: 13.10.09 16:44
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Я полагаю, имелся в виду if_exists


И использовать предполагалось видимо так:

    if (if_exists(begin, end, value))
Re[2]: Алгоритм found
От: minorlogic Украина  
Дата: 13.10.09 16:58
Оценка: +1
Здравствуйте, zaufi, Вы писали:

Z>наверное таки лучше его назвать exists или is_exists если уж так хочется такую функциональность...


Может contains ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Дополнительный аргумент в пользу found
От: igna Россия  
Дата: 14.10.09 05:29
Оценка:
Иногда begin и end вычисляются непосредственно перед вызовом алгоритма поиска, что может привести к избыточному вычислению end:

    if (find(container.begin(), container.end(), value) == container.end())


Чтобы этого не происходило можно вычислить container.end() и сохранить его в переменной, но тогда разница по сравнению с использованием found усиливается в пользу последнего:

    container_type::const_iterator const container_end = container.end();
    if (find(container.begin(), container_end(), value) == container_end)


    if (found(container.begin(), container.end(), value))


Собственно это один из аргументов, которые приводит Мейерс в Effective STL в пользу использования алгоритмов по сравнению с циклами (Item 43. Prefer algorithm calls to hand-written loops).
Re: Алгоритм found
От: teufelsjunge Россия  
Дата: 14.10.09 05:35
Оценка:
Здравствуйте, igna, Вы писали:

I>Нередко алгоритм std::find используется не для того, чтобы действительно найти некоторый элемент, а только для того, чтобы узнать, есть такой элемент или нет:


Для поиска элемента есть std::lower_bound.
Re[2]: Алгоритм found
От: igna Россия  
Дата: 14.10.09 06:01
Оценка:
Здравствуйте, teufelsjunge, Вы писали:

T>Для поиска элемента есть std::lower_bound.


Во-первых этот алгоритм применим только для отсортированной последовательности, во-вторых как раз для отсортированных последовательностей аналог алгоритма found есть и называется std::binary_search. То есть непонятно, ты о чем?
Re[3]: Алгоритм found
От: teufelsjunge Россия  
Дата: 14.10.09 06:52
Оценка:
Здравствуйте, igna, Вы писали:

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


T>>Для поиска элемента есть std::lower_bound.


I>Во-первых этот алгоритм применим только для отсортированной последовательности, во-вторых как раз для отсортированных последовательностей аналог алгоритма found есть и называется std::binary_search. То есть непонятно, ты о чем?


Я немного невнимательно прочитал вопрос, сорри.

Ну, в не отсортированных последовательностях искать кроме как перебором всех элементов нет смысла. Так что, требование отсортированности вполне логично. А по поводу found, которую ты хочешь, она есть и назвается binary_search.

Из документации

binary_search --- Test if value exists in sorted array (function template)
lower_bound --- Return iterator to lower bound

Т.е. binary_search — как раз твой found, который ты хотел писать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.