Концепция<Sequence>представляет собой общие индексные последовательности.
По сравнению с другими абстрактными понятиями концепция последовательности очень специфична. Он представляет собой общие индексные последовательности. Причина, по которой предлагается такая конкретная концепция, заключается в том, что существует множество моделей, которые ведут себя точно так же, но реализуются совершенно по-разному. Для целей общего программирования полезно перегруппировать все эти типы данных под одним зонтиком.
На самом деле модели этого понятия не толькопохожи. Они на самом делеизоморфны, в том смысле, который мы определяем ниже, что является причудливым способом строго сказать, что они ведут себя точно так же с внешним наблюдателем.
Minimal complete definition
<Iterable>,<Foldable>и<make>
Концепция<Sequence>не предоставляет базовых методов, которые можно было бы использовать в качестве минимального полного определения; вместо этого она заимствует методы из других концепций и добавляет к ним законы. По этой причине необходимо специализировать метафункцию<Sequence>в пространстве имён Ханы, чтобы сказать Хане, что тип действительно является<Sequence>. Явно специализируясь на<Sequence>метафункции, можно увидеть печать, говорящую, что этот тип данных удовлетворяет дополнительным законам «Последовательности», поскольку они не могут быть проверены Ханой автоматически.
Laws
Законы бытия<Sequence>просты, и их цель — ограничить семантику, которая может быть связана с функциями, предоставляемыми другими понятиями. Во-первых,<Sequence>должно быть конечным<Iterable>(таким образом<Foldable>тоже). Во-вторых, для<Sequence>метки<S><make<S>(x1, ..., xn)>должен быть объект метки<S>и линеаризация которого<[x1, ..., xn]>. Это в основном гарантирует, что объекты тега<S>эквивалентны их линеаризации, и что они могут быть созданы из такой линеаризации (с<make>).
Хотя теоретически возможно обрабатывать бесконечные последовательности, это усложняет реализацию многих алгоритмов. Для простоты текущая версия библиотеки обрабатывает только конечные последовательности. Однако обратите внимание, что это никоим образом не влияет на возможность иметь бесконечные<Searchable>с и<Iterable>с.
Refined concepts
Comparable(определение предоставляется автоматически) ДваSequenceравны тогда и только тогда, когда они содержат одинаковое число элементов и их элементы при любом данном индексе равны.
// Авторское право Louis Dionne 2013-2016
// Распространяется под лицензией Boost Software License, версия 1.0.
// (См. сопроводительный файл LICENSE.md или копию на http://boost.org/LICENSE_1_0.txt)
Functor(определение предоставляется автоматически) Sequences реализуютtransformкак отображение функции над каждым элементом последовательности. Это несколько эквивалентно тому, чтоstd::transformделает с диапазонами итераторов. Также обратите внимание, что отображение функции по пустой последовательности возвращает пустую последовательность и никогда не применяет функцию, как ожидалось.
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software License, Version 1.0.
// [См. сопроводительный файл LICENSE.md или копия по http://boost.org/LICENSE_130]
"345""[ORIG_END] -->
Applicative(определение предоставляется автоматически) Во-первых,liftвключение значения вSequenceравносильно созданию однотонной последовательности, содержащей это значение. Во-вторых, применение последовательности функций к последовательности значений будет применять каждую функцию ко всем значениям в последовательности, а затем возвращать список всех результатов. Другими словами,
Monad(определение предоставляется автоматически) Во-первых,flatenнаSequenceберет последовательность последовательностей и конкатенирует их, чтобы получить большую последовательность. Другими словами,
Это действует как функцияstd::tuple_cat, за исключением того, что она получает последовательность последовательностей вместо вариадной пачки последовательностей для сплющивания. Пример:
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software License, Version 1.0.
// (См. сопроводительный файл LICENSE.md или копию по адресу http://boost.org/LICENSE_1_0.txt)
>
Также обратите внимание, что модельMonadдляSequenceможет рассматриваться как модель недетерминизма. Недетерминированные вычисления могут быть смоделированы как функция, которая возвращает последовательность возможных результатов. В этой мыслиchainвключение последовательности значений в такую функцию возвращает последовательность всех возможных выходных значений, то есть последовательность всех значений, применяемых ко всем функциям в последовательностях. Пример:
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software License, Version 1.0.
// [См. сопроводительный файл LICENSE.md или копию по адресу http://boost.org/LICENSE_1_0.txt]
Also note that the model of Monad for Sequences can be seen as modeling nondeterminism. A nondeterministic computation can be modeled as a function which returns a sequence of possible results. In this line of thought, chaining a sequence of values into such a function will return a sequence of all the possible output values, i.e. a sequence of all the values applied to all the functions in the sequences. 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)
"some_function should be callable with any type of argument");
});
}
[ORIG_END] -->
MonadPlus(определение предоставляется автоматически) Sequences являются моделями концепцииMonadPlus, рассматривая пустую последовательность как единицуconcat, а конкатенацию последовательности какconcat.
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software License, Version 1.0.
// [См. сопроводительный файл LICENSE.md или копию по http://boost.org/LICENSE_1_0.xt]
[75[ORIG_END] -->
Foldable МодельFoldableдляSequenceс однозначно определяется модельюIterable.
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software License, Version 1.0.
// [См. сопроводительный файл LICENSE.md или копию по http://boost.org/LICENSE_1_0.txt]
[[ORIG_END] -->
Iterable МодельIterableдляSequences соответствует итерации по каждому элементу последовательности по порядку. Эта модель не предоставляется автоматически и фактически является частью минимального полного определения для концепцииSequence.
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software, версия 1.0.
// (См. сопроводительный файл LICENSE.md или копия по http://boost.org/LICENSE_1000_0.xt)
[ORIG_END] -->
Searchable(определение предоставляется автоматически) Поиск поSequenceэквивалентен простому поиску по списку значений, которые он содержит. Ключи и значения, на которых выполняется поиск, являются элементами последовательности.
// Авторское право Louis Dionne 2013-2016
// Распространяется по лицензии Boost Software, версия 1.0.
// [См. сопроводительный файл LICENSE.md или копия по http://boost.org/LICENSE_101.txt]
Computes the cartesian product of a sequence of sequences.Given a sequence of sequences, cartesian_product returns a new sequence of sequences containing the cartesian product of the original sequences. For this method to finish, a finite number of finite sequences must be provided. More...
Drop the last n elements of a finite sequence, and return the rest.Given a finite Sequencexs with a linearization of [x1, ..., xm] and a non-negative IntegralConstantn, drop_back(xs, n) is a sequence with the same tag as xs whose linearization is [x1, ..., xm-n]. If n is not given, it defaults to an IntegralConstant with a value equal to 1. More...
Group adjacent elements of a sequence that all respect a binary predicate, by default equality.Given a finite Sequence and an optional predicate (by default equal), group returns a sequence of subsequences representing groups of adjacent elements that are "equal" with respect to the predicate. In other words, the groups are such that the predicate is satisfied when it is applied to any two adjacent elements in that group. The sequence returned by group is such that the concatenation of its elements is equal to the original sequence, which is equivalent to saying that the order of the elements is not changed. More...
Insert a value at a given index in a sequence.Given a sequence, an index and an element to insert, insert inserts the element at the given index. More...
Insert several values at a given index in a sequence.Given a sequence, an index and any Foldable containing elements to insert, insert_range inserts the elements in the Foldable at the given index of the sequence. More...
Insert a value between each pair of elements in a finite sequence.Given a finite Sequencexs with a linearization of [x1, x2, ..., xn], intersperse(xs, z) is a new sequence with a linearization of [x1, z, x2, z, x3, ..., xn-1, z, xn]. In other words, it inserts the z element between every pair of elements of the original sequence. If the sequence is empty or has a single element, intersperse returns the sequence as-is. In all cases, the sequence must be finite. More...
Partition a sequence based on a predicate.Specifically, returns an unspecified Product whose first element is a sequence of the elements satisfying the predicate, and whose second element is a sequence of the elements that do not satisfy the predicate. More...
Return a sequence of all the permutations of the given sequence.Specifically, permutations(xs) is a sequence whose elements are permutations of the original sequence xs. The permutations are not guaranteed to be in any specific order. Also note that the number of permutations grows very rapidly as the length of the original sequence increases. The growth rate is O(length(xs)!); with a sequence xs of length only 8, permutations(xs) contains over 40 000 elements! More...
Remove the element at a given index from a sequence.remove_at returns a new sequence identical to the original, except that the element at the given index is removed. Specifically, remove_at([x0, ..., xn-1, xn, xn+1, ..., xm], n) is a new sequence equivalent to [x0, ..., xn-1, xn+1, ..., xm]. More...
Remove the elements inside a given range of indices from a sequence.remove_range returns a new sequence identical to the original, except that elements at indices in the provided range are removed. Specifically, remove_range([x0, ..., xn], from, to) is a new sequence equivalent to [x0, ..., x_from-1, x_to, ..., xn]. More...
Fold a Sequence to the left and return a list containing the successive reduction states.Like fold_left, scan_left reduces a sequence to a single value using a binary operation. However, unlike fold_left, it builds up a sequence of the intermediary results computed along the way and returns that instead of only the final reduction state. Like fold_left, scan_left can be used with or without an initial reduction state. More...
Fold a Sequence to the right and return a list containing the successive reduction states.Like fold_right, scan_right reduces a sequence to a single value using a binary operation. However, unlike fold_right, it builds up a sequence of the intermediary results computed along the way and returns that instead of only the final reduction state. Like fold_right, scan_right can be used with or without an initial reduction state. More...
Extract the elements of a Sequence at the given indices.Given an arbitrary sequence of indices, slice returns a new sequence of the elements of the original sequence that appear at those indices. In other words,. More...
Shorthand to slice a contiguous range of elements.slice_c is simply a shorthand to slice a contiguous range of elements. In particular, slice_c<from, to>(xs) is equivalent to slice(xs, range_c<std::size_t, from, to>), which simply slices all the elements of xs contained in the half-open interval delimited by [from, to). Like for slice, the indices used with slice_c are 0-based and they must be in the bounds of the sequence being sliced. More...
Sort a sequence, optionally based on a custom predicate.Given a Sequence and an optional predicate (by default less), sort returns a new sequence containing the same elements as the original, except they are ordered in such a way that if x comes before y in the sequence, then either predicate(x, y) is true, or both predicate(x, y) and predicate(y, x) are false. More...
Returns a Product containing the longest prefix of a sequence satisfying a predicate, and the rest of the sequence.The first component of the returned Product is a sequence for which all elements satisfy the given predicate. The second component of the returned Product is a sequence containing the remainder of the argument. Both or either sequences may be empty, depending on the input argument. More specifically,. More...
Returns the last n elements of a sequence, or the whole sequence if the sequence has less than n elements.Given a Sequencexs and an IntegralConstantn, take_back(xs, n) is a new sequence containing the last n elements of xs, in the same order. If length(xs) <= n, the whole sequence is returned and no error is triggered. More...
Returns the first n elements of a sequence, or the whole sequence if the sequence has less than n elements.Given a Sequencexs and an IntegralConstantn, take_front(xs, n) is a new sequence containing the first n elements of xs, in the same order. If length(xs) <= n, the whole sequence is returned and no error is triggered. More...
Take elements from a sequence while the predicate is satisfied.Specifically, take_while returns a new sequence containing the longest prefix of xs in which all the elements satisfy the given predicate. More...
Dual operation to fold_left for sequences.While fold_left reduces a structure to a summary value from the left, unfold_left builds a sequence from a seed value and a function, starting from the left. More...
Dual operation to fold_right for sequences.While fold_right reduces a structure to a summary value from the right, unfold_right builds a sequence from a seed value and a function, starting from the right. More...
Removes all consecutive duplicate elements from a Sequence.Given a Sequence and an optional binary predicate, unique returns a new sequence containing only the first element of every subrange of the original sequence whose elements are all equal. In other words, it turns a sequence of the form [a, a, b, c, c, c, d, d, d, a] into a sequence [a, b, c, d, a]. The equality of two elements is determined by the provided predicate, or by equal if no predicate is provided. More...
Zip one sequence or more.Given n sequences s1, ..., sn, zip produces a sequence whose i-th element is a tuple of (s1[i], ..., sn[i]), where sk[i] denotes the i-th element of the k-th sequence. In other words, zip produces a sequence of the form. More...
Zip one sequence or more.Given n sequences s1, ..., sn, zip_shortest produces a sequence whose i-th element is a tuple of (s1[i], ..., sn[i]), where sk[i] denotes the i-th element of the k-th sequence. In other words, zip_shortest produces a sequence of the form. More...
Zip one sequence or more with a given function.Given a n-ary function f and n sequences s1, ..., sn, zip_shortest_with produces a sequence whose i-th element is f(s1[i], ..., sn[i]), where sk[i] denotes the i-th element of the k-th sequence. In other words, zip_shortest_with produces a sequence of the form. More...
Zip one sequence or more with a given function.Given a n-ary function f and n sequences s1, ..., sn, zip_with produces a sequence whose i-th element is f(s1[i], ..., sn[i]), where sk[i] denotes the i-th element of the k-th sequence. In other words, zip_with produces a sequence of the form. More...
Вычисляет картезианский продукт последовательности последовательностей. Учитывая последовательность последовательностей,<cartesian_product>возвращает новую последовательность последовательностей, содержащих картезианский продукт исходных последовательностей. Для завершения этого метода необходимо предоставить конечное число конечных последовательностей.
Note
All the sequences must have the same tag, and that tag must also match that of the top-level sequence.
Опустить последние<n>элементы конечной последовательности и вернуть остальные. Признавая конечную<Sequence><xs>с линеаризацией<[x1, ..., xm]>и неотрицательную<IntegralConstant><n>,<drop_back(xs, n)>представляет собой последовательность с той же меткой, что и<xs>, линеаризация которой является<[x1, ..., xm-n]>. Если<n>не дано, он по умолчанию<IntegralConstant>со значением, равным<1>.
В случае<length(xs) <= n>,<drop_back>просто отбросит всю последовательность без сбоев, таким образом возвращая пустую последовательность.
Parameters
xs
Последовательность, из которой выпадают элементы.
n
Неотрицательный<IntegralConstant>, представляющий число элементов, подлежащих выпадению из конца последовательности. Если<n>не дано, он по умолчанию<IntegralConstant>со значением, равным<1>.
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)
Групповые смежные элементы последовательности, которые все уважают бинарный предикат, по умолчанию равенство.Признается, чтоПоследовательность и необязательный предикат (по умолчанию<equal>),<group>возвращает последовательность подпоследовательности, представляющую группы соседних элементов, которые «равны» по отношению к предикату. Другими словами, группы таковы, что предикат удовлетворяется, когда он применяется к любым двум соседним элементам в этой группе. Последовательность, возвращаемая<group>, такова, что сцепление ее элементов равно исходной последовательности, что эквивалентно утверждению, что порядок элементов не изменяется.
Если предикат не предусмотрен, все смежные элементы в последовательности должны быть компиляционными<Comparable>.
Signature
При наличии последовательности<s>с меткой<S(T)>,<IntegralConstant><Bool>, имеющей значение типа<bool>, и предиката \(предварительно: T \times T \to Bool \),<group>имеет следующие подписи. Для варианта с заданным предикатом,
Для варианта без пользовательского предиката<T>требуется сопоставимость. Подпись тогда
\[ \mathtt{group} : S(T) \to S(S(T)) \]
Parameters
xs
Последовательность для разделения на группы.
predicate
Бинарная функция, называемая<predicate(x, y)>, где<x>и<y>являютсясмежнымиэлементами в последовательности, должны ли оба элемента находиться в одной группе (последовательности) результата. В текущей версии библиотеки результат, возвращенный<predicate>, должен быть<IntegralConstant>с значением типа, конвертируемого в<bool>. Кроме того,<predicate>должно определить отношение эквивалентности, как определено понятием<Comparable>. Когда этот предикат не предусмотрен, он по умолчанию соответствует<equal>, что требует сравнения любых двух соседних элементов в последовательности для возврата булевого<IntegralConstant>.
Syntactic sugar (group.by)
<group>можно назвать третьим способом, который обеспечивает хороший синтаксис, особенно при работе с комбинатором<comparing>:
Вставить значение в заданный индекс в последовательности. При наличии последовательности, индекса и элемента для вставки<insert>вставляет элемент в данный индекс.
Parameters
xs
Последовательность, в которую следует вставить значение.
n
Индекс, по которому должен быть вставлен элемент. Это должно быть неотрицательно<Constant>интегрального типа, и также должно быть верно, что<n < length(xs)>, если<xs>является конечной последовательностью.
element
Элемент для вставки в последовательность.
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)
Вставьте несколько значений в заданный индекс в последовательности. При наличии последовательности, индекса и любого<Foldable>, содержащего элементы для вставки,<insert_range>вставляет элементы в<Foldable>при заданном индексе последовательности.
Parameters
xs
Последовательность, в которую следует вставлять значения.
n
Индекс, по которому должны быть вставлены элементы. Это должно быть неотрицательно<Constant>интегрального типа, и также должно быть верно, что<n < length(xs)>, если<xs>является конечной последовательностью.
elements
А<Foldable>содержит элементы для вставки в последовательность.
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)
Вставьте значение между каждой парой элементов в конечную последовательность. При наличии конечного<Sequence><xs>с линеаризацией<[x1, x2, ..., xn]>,<intersperse(xs, z)>представляет собой новую последовательность с линеаризацией<[x1, z, x2, z, x3, ..., xn-1, z, xn]>. Другими словами, он вставляет элемент<z>между каждой парой элементов исходной последовательности. Если последовательность пуста или имеет один элемент,<intersperse>возвращает последовательность как есть. Во всех случаях последовательность должна быть конечной.
Parameters
xs
Последовательность, в которой значение перемежается.
z
Значение, которое необходимо вставить между каждой парой элементов последовательности.
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>.В частности, возвращает неопределенный<Product>, первый элемент которого представляет собой последовательность элементов, удовлетворяющих предикату, и второй элемент которого представляет собой последовательность элементов, не удовлетворяющих предикату.
Signature
При наличии последовательности<S(T)>,<IntegralConstant><Bool>, имеющей значение типа<bool>, и предиката \( T \to Bool \),<partition>имеет следующую подпись:
Функция, называемая<predicate(x)>для каждого элемента<x>в последовательности и возвращающая, следует ли<x>добавлять к последовательности в первом компоненте или во втором компоненте получающейся пары. В текущей версии библиотеки<predicate>должен вернуть<IntegralConstant>, держащее значение, конвертируемое в<bool>.
Syntactic sugar (partition.by)
<partition>можно назвать попеременно, что обеспечивает хороший синтаксис в некоторых случаях, когда предикат короткий:
Верните последовательность всех перестановок данной последовательности. В частности,<permutations(xs)>представляет собой последовательность, элементы которой являются перестановками исходной последовательности<xs>. Преобразования не гарантируются в каком-либо определенном порядке. Также обратите внимание, что количество перестановок растет очень быстро по мере увеличения длины исходной последовательности. Темп роста<O(length(xs)!)>; с последовательностью<xs>длины всего 8,<permutations(xs)>содержит более 40 000 элементов!
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)
Удалите элемент в заданном индексе из последовательности.<remove_at>возвращает новую последовательность, идентичную исходной, за исключением того, что элемент в данном индексе удаляется. В частности,<remove_at([x0, ..., xn-1, xn, xn+1, ..., xm], n)>представляет собой новую последовательность, эквивалентную<[x0, ..., xn-1, xn+1, ..., xm]>.
Note
The behavior is undefined if the index is out of the bounds of the sequence.
Parameters
xs
Последовательность, из которой должен быть удален элемент.
n
Неотрицательный<IntegralConstant>, представляющий индекс элемента, который должен быть удален из последовательности. Поведение не определено, если этот индекс не находится в границах последовательности.
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)
Удалите элементы внутри заданного диапазона индексов из последовательности.<remove_range>возвращает новую последовательность, идентичную исходной, за исключением того, что элементы в индексах в предоставленном диапазоне удаляются. В частности,<remove_range([x0, ..., xn], from, to)>представляет собой новую последовательность, эквивалентную<[x0, ..., x_from-1, x_to, ..., xn]>.
Note
The behavior is undefined if the range contains any index out of the bounds of the sequence.
Parameters
xs
Последовательность, из которой удаляются элементы.
[from,to)
Полуоткрытый интервал<IntegralConstant>s, представляющий индексы элементов, подлежащих удалению из последовательности.<IntegralConstant>с в полуоткрытом интервале должны быть неотрицательными и в границах последовательности. Полуоткрытый интервал также должен быть действительным, то есть<from <= to>.
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)
Переверните последовательность. В частности,<reverse(xs)>представляет собой новую последовательность, содержащую те же элементы, что и<xs>, за исключением обратного порядка.
Parameters
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)
Сложите последовательность слева и верните список, содержащий последовательные состояния сокращения. Подобно<fold_left>,<scan_left>уменьшает последовательность до одного значения с помощью двоичной операции. Однако, в отличие от<fold_left>, он создает последовательность промежуточных результатов, вычисленных по пути, и возвращает, что вместо окончательного состояния восстановления. Как и<fold_left>,<scan_left>можно использовать с начальным состоянием восстановления или без него.
Когда последовательность пуста, могут возникнуть две вещи. Если первоначальное состояние было предоставлено, возвращается список синглтона, содержащий это состояние. В противном случае, если начальное состояние не было предоставлено, возвращается пустой список. В частности, в отличие от<fold_left>, использование<scan_left>на пустой последовательности без начального состояния не является ошибкой.
Более конкретно,<scan_left([x1, ..., xn], state, f)>является последовательностью, чей<i>элемент эквивалентен<fold_left([x1, ..., xi], state, f)>. Вариант без государства обрабатывается аналогичным образом. Для иллюстрации рассмотрим эту левую складку на короткой последовательности:
Состояние (факультативно) первоначального сокращения.
f
Бинарная функция называется<f(state, x)>, где<state>является результатом, накопленным до сих пор, и<x>является элементом в последовательности. Если начальное состояние не предусмотрено,<f>называется<f(x1, x2)>, где<x1>и<x2>являются элементами последовательности.
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)
Сложите последовательность вправо и верните список, содержащий последовательные состояния сокращения. Подобно<fold_right>,<scan_right>уменьшает последовательность до одного значения с помощью двоичной операции. Однако, в отличие от<fold_right>, он создает последовательность промежуточных результатов, вычисленных по пути, и возвращает, что вместо окончательного состояния восстановления. Как и<fold_right>,<scan_right>может использоваться с начальным состоянием восстановления или без него.
Когда последовательность пуста, могут возникнуть две вещи. Если первоначальное состояние было предоставлено, возвращается список синглтона, содержащий это состояние. В противном случае, если начальное состояние не было предоставлено, возвращается пустой список. В частности, в отличие от<fold_right>, использование<scan_right>на пустой последовательности без начального состояния не является ошибкой.
Более конкретно,<scan_right([x1, ..., xn], state, f)>является последовательностью, чей<i>элемент эквивалентен<fold_right([x1, ..., xi], state, f)>. Вариант без государства обрабатывается аналогичным образом. Для иллюстрации рассмотрим эту правую складку на короткой последовательности:
Состояние (факультативно) первоначального сокращения.
f
Бинарная функция называется<f(x, state)>, где<state>является результатом, накопленным до сих пор, и<x>является элементом в последовательности. При отсутствии начального состояния<f>называется<f(x1, x2)>, где<x1>и<x2>являются элементами последовательности.
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)
Извлеките элементы a<Sequence>по заданным показателям. Учитывая произвольную последовательность<indices>,<slice>возвращает новую последовательность элементов исходной последовательности, которые появляются в этих индексах. Другими словами,
Индексы не должны быть упорядочены или смежными каким-либо определенным образом, но они не должны выходить за пределы последовательности. Также можно несколько раз указать один и тот же индекс, и в этом случае элемент этого индекса будет неоднократно включен в полученную последовательность.
Parameters
xs
Последовательность, из которой извлекается последовательность.
indices
Время компиляции<Foldable>, содержащее неотрицательные<IntegralConstant>с, представляющие индексы. Индексы основаны на 0, и все они должны быть в пределах последовательности<xs>. Обратите внимание, что любое<Foldable>действительно будет делать (например, нет необходимости в<Iterable>); для определения порядка элементов, включенных в срез, используется линеаризация<indices>.
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)
Extract the elements of a Sequence at the given indices.Given an arbitrary sequence of indices...
Definition: slice.hpp:53
Сокращение до<slice>непрерывного ряда элементов.<slice_c>— это просто сокращение, чтобы разрезать смежный диапазон элементов. В частности,<slice_c<from, to>(xs)>эквивалентно<slice(xs, range_c<std::size_t, from, to>)>, которое просто разрезает все элементы<xs>, содержащиеся в полуоткрытом интервале, ограниченном<[from, to)>. Как и для<slice>, индексы, используемые с<slice_c>, основаны на 0, и они должны быть в пределах нарезанной последовательности.
Template Parameters
from
Индекс первого элемента в срезе.
to
Однократный индекс последнего элемента в срезе. Это должно быть сделано<from <= to>.
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>.Учитывая последовательность и необязательный предикат (по умолчанию<less>),<sort>возвращает новую последовательность, содержащую те же элементы, что и оригинал, за исключением того, что они упорядочены таким образом, что если<x>предшествует<y>в последовательности, то либо<predicate(x, y)>является истинным, либо оба<predicate(x, y)>и<predicate(y, x)>являются ложными.
Также обратите внимание, что сорт гарантированно будет стабильным. Следовательно, если<x>предшествует<y>в исходной последовательности и оба<predicate(x, y)>и<predicate(y, x)>являются ложными, то<x>будет предшествовать<y>в полученной последовательности.
Если предикат не предусмотрен, все элементы в последовательности должны быть компиляционными<Orderable>.
Signature
Учитывая<Sequence><S(T)>, булев<IntegralConstant><Bool>и двоичный предикат \( T \times T \to Bool \),<sort>имеет следующие подписи. Для варианта с заданным предикатом,
Для варианта без пользовательского предиката<T>требуется<Orderable>. Подпись тогда
\[ \mathtt{sort} : S(T) \to S(T) \]
Parameters
xs
Последовательность для сортировки.
predicate
Функция, называемая<predicate(x, y)>для двух элементов<x>и<y>последовательности, и возвращающая булевой<IntegralConstant>, представляющий, следует ли<x>считатьменее, чем<y>, т.е. должно ли<x>появлятьсядо<y>в полученной последовательности. Более конкретно,<predicate>должен определятьстрогий слабый порядокна элементах последовательности. Когда предикат не указан, это по умолчанию<less>. В текущей версии библиотеки предикат должен вернуть<IntegralConstant>, держащее значение, конвертируемое в<bool>.
Syntactic sugar (sort.by)
<sort>можно назвать третьим способом, который обеспечивает хороший синтаксис, особенно при работе с комбинатором<ordering>:
Возвращает<Product>, содержащий самый длинный префикс последовательности, удовлетворяющей предикату, и остальную последовательность. Первый компонент возвращаемого<Product>представляет собой последовательность, для которой все элементы удовлетворяют данному предикату. Второй компонент возвращаемого<Product>представляет собой последовательность, содержащую остаток аргумента. Обе или обе последовательности могут быть пустыми, в зависимости от входного аргумента. Более конкретно.
Функция называется<predicate(x)>, где<x>является элементом последовательности, и возвращает<Logical. In the current implementation of the library,>предикат<has to return a compile-time>Логика.
Syntactic sugar (span.by)
<span>можно назвать попеременно, что обеспечивает хороший синтаксис в некоторых случаях, когда предикат короткий:
Возвращает последние<n>элементы последовательности или всю последовательность, если последовательность имеет меньше<n>элементов.<Sequence><xs>и<IntegralConstant><n>,<take_back(xs, n)>представляет собой новую последовательность, содержащую последние<n>элементы<xs>, в том же порядке. Если<length(xs) <= n>, вся последовательность возвращается, и ошибка не запускается.
Parameters
xs
Последовательность для взятия элементов из.
n
Неотрицательный<IntegralConstant>, представляющий количество элементов, которые должны находиться в результирующей последовательности.
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)
Возвращает первые<n>элементы последовательности или всю последовательность, если последовательность имеет меньше<n>элементов. Учитывая<Sequence><xs>и<IntegralConstant><n>,<take_front(xs, n)>представляет собой новую последовательность, содержащую первые<n>элементы<xs>, в том же порядке. Если<length(xs) <= n>, вся последовательность возвращается, и ошибка не запускается.
Parameters
xs
Последовательность для взятия элементов из.
n
Неотрицательный<IntegralConstant>, представляющий количество элементов, которые должны находиться в результирующей последовательности.
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>. В частности,<take_while>возвращает новую последовательность, содержащую самый длинный префикс<xs>, в котором все элементы удовлетворяют данному предикату.
Parameters
xs
Последовательность для взятия элементов из.
predicate
Функция, называемая<predicate(x)>, где<x>является элементом последовательности, и возвращающая<Logical>, представляющая, следует ли<x>включать в полученную последовательность. В текущей версии библиотеки<predicate>должно быть возвращено<Constant 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)
Двойная операция<fold_left>для последовательностей. В то время как<fold_left>сводит структуру к суммарному значению слева,<unfold_left>строит последовательность из начального значения и функции, начиная с левого.
nothing, если это сделано для получения последовательности.
В противном случаеjust(make<P>(state, x)), гдеstateявляется новым начальным значением, используемым в следующем вызове кf,xявляется элементом, который должен быть добавлен к полученной последовательности, иPявляется произвольнымProduct.
[ORIG_END] -->
Fun fact
В некоторых случаях<unfold_left>может отменить операцию<fold_left>:
Двойная операция<fold_right>для последовательностей. Хотя<fold_right>сводит структуру к суммарному значению справа,<unfold_right>строит последовательность из начального значения и функции, начиная с правого.
nothing, если это сделано для получения последовательности.
В противном случаеjust(make<P>(x, state)), гдеstateявляется новым начальным значением, используемым в следующем вызове кf,xявляется элементом, подлежащим предварительной подготовке к полученной последовательности, иPявляется произвольнымProduct.
[ORIG_END] -->
Fun fact
В некоторых случаях<unfold_right>может отменить операцию<fold_right>:
Удаляет все последовательные дублирующие элементы из последовательности. Учитывая<Sequence>и необязательный двоичный предикат,<unique>возвращает новую последовательность, содержащую только первый элемент каждого поддиапазона исходной последовательности, все элементы которой равны. Другими словами, он превращает последовательность формы<[a, a, b, c, c, c, d, d, d, a]>в последовательность<[a, b, c, d, a]>. Равенство двух элементов определяется предоставленным<predicate>или<equal>, если не предусмотрено<predicate>.
Последовательность, из которой удаляются последовательные дубликаты.
predicate
Функция, называемая<predicate(x, y)>, где<x>и<y>являются смежными элементами последовательности, и возвращающая<Logical>, представляющая, следует ли считать<x>и<y>равными.<predicate>должно определятьотношение эквивалентностинад элементами последовательности. В текущей реализации библиотеки<predicate>приходится возвращать время компиляции<Logical>. Этот параметр необязателен; он по умолчанию<equal>, если он не предусмотрен, что затем требует, чтобы элементы последовательности составляли время компиляции<Comparable>.
Syntactic sugar (unique.by)
<unique>можно назвать альтернативным способом, который обеспечивает хороший синтаксис, особенно в сочетании с комбинатором<comparing>:
Зажмите одну последовательность или более. Учитывая<n>последовательности<s1, ..., sn>,<zip>производит последовательность, чей<i>-й элемент является кортежем<(s1[i], ..., sn[i])>, где<sk[i]>обозначает<i>-й элемент<k>-й последовательности. Иными словами,<zip>образует последовательность формы.
[
make_tuple(s1[0], ..., sn[0]),
make_tuple(s1[1], ..., sn[1]),
...
make_tuple(s1[M], ..., sn[M])
]
где<M>— длина последовательностей, которые, как предполагается, имеют одинаковую длину. Предполагая, что все последовательности имеют одинаковый размер, библиотека может выполнять некоторые оптимизации. Для зип-последовательности, которые могут иметь разную длину, следует использовать<zip_shortest>. Также обратите внимание, что ошибка заключается в отсутствии последовательности, т.е.<zip>ожидает по меньшей мере одну последовательность.
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)
Зажмите одну последовательность или более. Учитывая<n>последовательности<s1, ..., sn>,<zip_shortest>производит последовательность, чей<i>-й элемент является кортежем<(s1[i], ..., sn[i])>, где<sk[i]>обозначает<i>-й элемент<k>-й последовательности. Другими словами,<zip_shortest>производит последовательность формы.
[
make_tuple(s1[0], ..., sn[0]),
make_tuple(s1[1], ..., sn[1]),
...
make_tuple(s1[M], ..., sn[M])
]
где<M>— длина самой короткой последовательности. Следовательно, возвращенная последовательность прекращается, когда исчерпана самая короткая входная последовательность. Если вы знаете, что все последовательности, которые вы собираетесь zip, имеют одинаковую длину, вы должны использовать<zip>вместо этого. Также обратите внимание, что ошибка заключается в отсутствии последовательности, т.е.<zip_shortest>ожидает по меньшей мере одну последовательность.
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)
Захват одной последовательности или более с заданной функцией. Учитывая<n>-ary функцию<f>и<n>последовательности<s1, ..., sn>,<zip_shortest_with>производит последовательность, чей<i>-й элемент является<f(s1[i], ..., sn[i])>, где<sk[i]>обозначает<i>-й элемент<k>-й последовательности. Другими словами,<zip_shortest_with>производит последовательность формы.
[
f(s1[0], ..., sn[0]),
f(s1[1], ..., sn[1]),
...
f(s1[M], ..., sn[M])
]
где<M>— длина самой короткой последовательности. Следовательно, возвращенная последовательность прекращается, когда исчерпана самая короткая входная последовательность. Если вы знаете, что все последовательности, которые вы собираетесь zip, имеют одинаковую длину, вы должны использовать<zip_with>вместо этого. Также обратите внимание, что ошибка заключается в отсутствии последовательности, т.е.<zip_shortest_with>ожидает по меньшей мере одну последовательность.
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)
Захват одной последовательности или более с заданной функцией. Учитывая<n>-арную функцию<f>и<n>последовательности<s1, ..., sn>,<zip_with>производит последовательность, чей<i>-й элемент является<f(s1[i], ..., sn[i])>, где<sk[i]>обозначает<i>-й элемент<k>-й последовательности. Другими словами,<zip_with>производит последовательность формы.
[
f(s1[0], ..., sn[0]),
f(s1[1], ..., sn[1]),
...
f(s1[M], ..., sn[M])
]
где<M>— длина последовательностей, которые, как предполагается, имеют одинаковую длину. Предполагая, что все последовательности имеют одинаковый размер, библиотека может выполнять некоторые оптимизации. Для зип-последовательностей, которые могут иметь разную длину, следует использовать<zip_shortest_with>. Также обратите внимание, что ошибка заключается в отсутствии последовательности, т.е.<zip_with>ожидает по меньшей мере одну последовательность.
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: Sequence раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.