Концепция<Searchable>представляет собой структуры, которые можно искать.
Интуитивно<Searchable>— это любая структура, конечная или бесконечная, содержащая элементы, которые можно искать с помощью предиката. Иногда<Searchable>s связывает ключи с значениями; можно искать ключ с предикатом, и значение, связанное с ним, возвращается. Это приводит к появлению картоподобных структур данных. В других случаях элементы структуры, которые ищутся (т.е. те, к которым применяется предикат), являются теми же, которые возвращаются, что приводит к появлению набороподобных структур данных. В общем, мы будем относиться кключамструктуры<Searchable>как к тем элементам, которые используются для поиска, и кзначениям<Searchable>как к тем элементам, которые возвращаются при успешном поиске. Как было объяснено, нет требования, чтобы оба понятия различались, и часто полезно, чтобы ключи и значения совпадали (подумайте о<std::set>).
Некоторые методы, такие как<any_of>,<all_of>и<none_of>, позволяют выполнять простые запросы на клавишах структуры, в то время как другие методы, такие как<find>и<find_if>, позволяют находить значение, связанное с ключом. Наиболее специфический метод всегда должен использоваться, если вы заботитесь о производительности, потому что обычно тяжелые оптимизации могут быть выполнены более конкретными методами. Например, ассоциативная структура данных, реализованная в виде хеш-таблицы, будет гораздо быстрее для доступа с использованием<find>, чем<find_if>, поскольку во втором случае ей придется выполнять линейный поиск по всем записям. В этом случае<contains>будет намного быстрее, чем<any_of>.
Проницательность В ленивом контексте оценки любой<Foldable>может также стать моделью<Searchable>, потому что мы можем лениво искать через структуру с<fold_right>. Однако в контексте C++ некоторые<Searchable>s нельзя сложить; подумайте, например, о бесконечном множестве.
Minimal complete definition
<find_if>и<any_of>
При предоставлении<find_if>и<any_of>другие функции выполняются в соответствии с законами, изложенными ниже.
Note
We could implement any_of(xs, pred) by checking whether find_if(xs, pred) is an empty optional or not, and then reduce the minimal complete definition to find_if. However, this is not done because that implementation requires the predicate of any_of to return a compile-time Logical, which is more restrictive than what we have right now.
Laws
Для того чтобы семантика методов была последовательной, некоторые свойства должны удовлетворяться любой моделью концепции<Searchable>. Для любого<Searchable>s<xs>и<ys>и любого предиката<p>должны быть выполнены следующие законы:
Встроенные массивы, размер которых известен, можно искать, если они были однородными кортежами. Однако, поскольку массивы могут удерживать только объекты одного типа и предикат к<find_if>должен возвращать время компиляции<Logical>, метод<find_if>довольно бесполезен. По аналогичным причинам метод<find>также довольно бесполезен. Эта модель предоставляется в основном из-за метода<any_of>; друзья, которые полезны и эффективны для компиляции.
Structure preserving functions
Учитывая два<Searchables><S1>и<S2>, функция \(f : S_1(X) \to S_2(X) \) считается сохраняющей структуру<Searchable>, если для всех<xs>типа данных<S1(X)>и предикатов \(\mathtt{pred} : X \to Bool \) (для<Logical><Bool>),
any_of(xs, pred) if and only if any_of(f(xs), pred)
Эти требования можно понимать как указание на то, что<f>не изменяет содержание<xs>, хотя может изменять порядок элементов. Как обычно, такое структурно-сохраняющее преобразование называется встраиванием, если оно также является инъекционным, то есть если это преобразование без потерь.
Returns whether all the keys of the structure are true-valued.The keys of the structure must be Logicals. If the structure is not finite, a false-valued key must appear at a finite "index" in order for this method to finish. More...
Returns whether all the keys of the structure satisfy the predicate.If the structure is not finite, predicate has to return a false- valued Logical after looking at a finite number of keys for this method to finish. More...
Returns whether any key of the structure is true-valued.The keys of the structure must be Logicals. If the structure is not finite, a true-valued key must appear at a finite "index" in order for this method to finish. More...
Returns whether any key of the structure satisfies the predicate.If the structure is not finite, predicate has to be satisfied after looking at a finite number of keys for this method to finish. More...
Returns the value associated to the given key in a structure, or fail.Given a key and a Searchable structure, at_key returns the first value whose key is equal to the given key, and fails at compile-time if no such key exists. This requires the key to be compile-time Comparable, exactly like for find. at_key satisfies the following: More...
Returns whether the key occurs in the structure.Given a Searchable structure xs and a key, contains returns whether any of the keys of the structure is equal to the given key. If the structure is not finite, an equal key has to appear at a finite position in the structure for this method to finish. For convenience, contains can also be applied in infix notation. More...
Return whether the key occurs in the structure.Specifically, this is equivalent to contains, except in takes its arguments in reverse order. Like contains, in can also be applied in infix notation for increased expressiveness. This function is not a method that can be overriden; it is just a convenience function provided with the concept. More...
Finds the value associated to the given key in a structure.Given a key and a Searchable structure, find returns the just the first value whose key is equal to the given key, or nothing if there is no such key. Comparison is done with equal. find satisfies the following: More...
Finds the value associated to the first key satisfying a predicate.Given a Searchable structure xs and a predicate pred, find_if(xs, pred) returns just the first element whose key satisfies the predicate, or nothing if there is no such element. More...
Returns whether two Searchables are disjoint.Given two Searchables xs and ys, is_disjoint returns a Logical representing whether the keys in xs are disjoint from the keys in ys, i.e. whether both structures have no keys in common. More...
Returns whether a structure contains a subset of the keys of another structure.Given two Searchables xs and ys, is_subset returns a Logical representing whether xs is a subset of ys. In other words, it returns whether all the keys of xs are also present in ys. This method does not return whether xs is a strict subset of ys; if xs and ys are equal, all the keys of xs are also present in ys, and is_subset returns true. More...
Returns whether all of the keys of the structure are false-valued.The keys of the structure must be Logicals. If the structure is not finite, a true-valued key must appear at a finite "index" in order for this method to finish. More...
Returns whether none of the keys of the structure satisfy the predicate.If the structure is not finite, predicate has to return a true- valued Logical after looking at a finite number of keys for this method to finish. More...
Возвращает, являются ли все ключи структуры истинными. Ключи от конструкции должны быть<Logical>с. Если структура не является конечной, ложно-значный ключ должен появиться на конечном «индексе», чтобы этот метод закончился.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает, удовлетворяют ли все ключи структуры<predicate>. Если структура не является конечной,<predicate>должен вернуть ложное значение<Logical>после просмотра конечного числа ключей для этого метода.
Parameters
xs
Структура для поиска.
predicate
Функция называется<predicate(k)>, где<k>является ключом структуры, и возвращает<Logical>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает, является ли любой ключ структуры истинным. Ключи от конструкции должны быть<Logical>с. Если структура не является конечной, то для того, чтобы этот метод закончился, на конечном «индексе» должен появиться ключ с истинным значением.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает ли какой-либо ключ структуры удовлетворяет<predicate>. Если структура не является конечной,<predicate>должно быть удовлетворено после просмотра конечного числа клавиш для этого метода, чтобы закончить.
Parameters
xs
Структура для поиска.
predicate
Функция называется<predicate(k)>, где<k>является ключом структуры, и возвращает<Logical>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает значение, связанное с заданным ключом в структуре, или выходит из строя. При наличии структуры<key>и<Searchable>,<at_key>возвращает первое значение, ключ которого равен данному<key>, и выходит из строя во время компиляции, если такой ключ не существует. Для этого требуется<key>время компиляции<Comparable>, как и для<find>.<at_key>удовлетворяет следующим требованиям:
Если<Searchable>действительно хранит элементы, которые он содержит,<at_key>требуется вернуть ссылку на lvalue, ссылку на lvalue на const или ссылку на rvalue на найденное значение, где тип ссылки должен соответствовать типу ссылки, переданной структуре<at_key>. Если<Searchable>не хранит элементы, которые он содержит (т.е. генерирует их по требованию), это требование отпадает.
Parameters
xs
Структура, которую нужно искать.
key
Ключ, который нужно искать в структуре. Ключ должен быть<Comparable>с другими ключами структуры. В текущей версии библиотеки сравнение<key>с любым другим ключом структуры должно возвращать время компиляции<Logical>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращается ли ключ в структуре. При наличии<Searchable>структуры<xs>и<key>,<contains>возвращается, является ли любой из ключей структуры равным данному<key>. Если структура не конечна, равный ключ должен появиться в конечном положении в структуре для завершения этого метода. Для удобства<contains>можно также применять в инфиксной записи.
Parameters
xs
Структура для поиска.
key
Ключ, который нужно искать в структуре. Ключ должен быть<Comparable>с другими ключами структуры.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Вернитесь, если ключ находится в структуре. В частности, это эквивалентно<contains>, за исключением<in>принимает свои аргументы в обратном порядке. Как и<contains>,<in>также может быть применен в фиксации для повышения выразительности. Эта функция не является методом, который может быть перегружен; это просто функция удобства, обеспеченная концепцией.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Находит значение, связанное с данным ключом в структуре. При наличии<key>и<Searchable>структуры<find>возвращает<just>первое значение, ключ которого равен данному<key>, или<nothing>, если такого ключа нет. Сравнение проводится с<equal>.<find>удовлетворяет следующим требованиям:
Ключ, который нужно искать в структуре. Ключ должен быть<Comparable>с другими ключами структуры. В текущей версии библиотеки сравнение<key>с любым другим ключом структуры должно возвращать время компиляции<Logical>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Находит значение, связанное с первым ключом, удовлетворяющим предикату. При наличии<Searchable>структуры<xs>и предиката<pred><find_if(xs, pred)>возвращает<just>первый элемент, ключ которого удовлетворяет предикату, или<nothing>, если такого элемента нет.
Parameters
xs
Структура, которую нужно искать.
predicate
Функция, называемая<predicate(k)>, где<k>является ключом структуры и возвращает, является ли<k>ключом искомого элемента. В текущей версии библиотеки предикат должен возвращать значение<IntegralConstant>, которое может быть преобразовано в<bool>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает ли два<Searchable>несвязанных. Учитывая два<Searchable>с<xs>и<ys>,<is_disjoint>возвращает a<Logical>, представляющее, являются ли ключи в<xs>несвязанными с ключами в<ys>, то есть не имеют ли обе структуры общих ключей.
Parameters
xs,ys
Два<Searchable>для проверки на несоответствие.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает, содержит ли структура подмножество ключей другой структуры. При наличии двух<Searchable>s<xs>и<ys>,<is_subset>возвращает<Logical>, представляющее, является ли<xs>подмножеством<ys>. Другими словами, он возвращает, все ли ключи<xs>также присутствуют в<ys>. Этот метод не возвращает, является ли<xs>строгимподмножеством<ys>; если<xs>и<ys>равны, все ключи<xs>также присутствуют в<ys>, и<is_subset>возвращает истинно.
Note
For convenience, is_subset can also be applied in infix notation.
Cross-type version of the method
Этот метод отправляется с использованием тегов обоих аргументов. Он может быть назван с любыми двумя<Searchable>s общим<Searchable>встраиванием, как определено в основной документации концепции<Searchable>. Когда<Searchable>s с двумя различными тегами, но совместное использование общего встраивания отправляется в<is_subset>, они сначала преобразуются в этот общий<Searchable>, а затем используется<is_subset>метод общего встраивания. Конечно, метод может быть перегружен для пользовательских<Searchable>для эффективности.
Note
While cross-type dispatching for is_subset is supported, it is not currently used by the library because there are no models of Searchable with a common embedding.
Parameters
xs
Структура для проверки, является ли она подмножеством<ys>.
ys
Строение для проверки, является ли оно супермножеством<xs>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает, являются ли все ключи структуры ложными. Ключи от конструкции должны быть<Logical>с. Если структура не является конечной, то для того, чтобы этот метод закончился, на конечном «индексе» должен появиться ключ с истинным значением.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращается, если ни один из ключей структуры не удовлетворяет<predicate>. Если структура не конечна,<predicate>должен вернуть истинное значение<Logical>после просмотра конечного числа ключей для этого метода.
Parameters
xs
Структура для поиска.
predicate
Функция называется<predicate(k)>, где<k>является ключом структуры, и возвращает<Logical>.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Статья Boost.Hana: Searchable раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.