名前空間
変種
操作

std::experimental::ranges::is_permutation

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
template< ForwardIterator I1, Sentinel<I1> S1, ForwardIterator I2, Sentinel<I2> S2,

          class Pred = ranges::equal_to<>,
          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
bool is_permutation( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(1) (ranges TS)
template< ForwardRange R1, ForwardRange R2, class Pred = ranges::equal_to<>,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires IndirectlyComparable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                                  Pred, Proj1, Proj2>
bool is_permutation( R1&& r1, R2&& r2, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(2) (ranges TS)
template< ForwardIterator I1, Sentinel<I1> S1, class I2,

          class Pred = ranges::equal_to<>,
          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires ForwardIterator<std::decay_t<I2>> && !Range<I2> &&
             IndirectlyComparable<I1, std::decay_t<I2>, Pred, Proj1, Proj2>
bool is_permutation( I1 first1, S1 last1, I2&& first2_, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(3) (ranges TS)
(非推奨)
template< ForwardRange R1, class I2, class Pred = ranges::equal_to<>,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires ForwardIterator<std::decay_t<I2>> && !Range<I2> &&
             IndirectlyComparable<ranges::iterator_t<R1>, std::decay_t<I2>, Pred, Proj1, Proj2>
bool is_permutation( R1&& r1, I2&& first2_, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(4) (ranges TS)
(非推奨)
1) range [first1last1) の要素の置換が存在し、それが range [first2last2) と等しくなる場合は true を返し、そうでない場合は false を返します。
2) (1) と同様ですが、最初のソース range として r1 を、2 番目のソース range として r2 を使用します。あたかも ranges::begin(r1)first1ranges::end(r1)last1ranges::begin(r2)first2ranges::end(r2)last2 として使用するかのように動作します。
3) (1) と同様ですが、first2std::decay_t<I2> first2 = std::forward<I2>(first2_); として定義され、last2first2 + (last1 - first1) となります。
4) (3) と同じですが、r1 を最初のソース範囲として使用します。これは、ranges::begin(r1)first1ranges::end(r1)last1 として使用するのと同等です。

2 つの range が等しいとみなされるのは、要素数が同じであり、range [first1last1) 内のすべてのイテレータ i について、ranges::invoke(pred, ranges::invoke(proj1, *i), ranges::invoke(proj2, *(first2 + (i - first1))))true になるときです。

上記に示された宣言にもかかわらず、アルゴリズム宣言のテンプレートパラメータの実際の数と順序は未指定です。したがって、アルゴリズムを呼び出す際に明示的なテンプレート引数を使用すると、プログラムはおそらくポータブルではありません。

目次

[編集] Parameters

first1, last1 - 要素の最初の範囲
r1 - 要素の最初の範囲
first2, last2 - 要素の 2 番目の範囲
r2 - 要素の 2 番目の範囲
first2_ - 要素の 2 番目の範囲の開始位置
pred - 射影された要素に適用する述語
proj1 - 最初の範囲の要素に適用する射影
proj2 - 2番目の範囲の要素に適用する射影

[編集] Return value

range [first1last1) が range [first2last2) の置換である場合は true

[編集] Complexity

述語と各射影の適用は最大 O(N2) 回、またはシーケンスが既に等しい場合はちょうど N 回です。N = last1 - first1

ただし、SizedSentinel<S1, I1> && SizedSentinel<S2, I2> が満たされ、かつ last1 - first1 != last2 - first2 の場合、述語と射影の適用は行われません。

[編集] Example

[編集] See also

あるシーケンスが別のシーケンスの順列であるかを判断する
(関数テンプレート) [編集]
要素の範囲の次に大きい辞書順の順列を生成する
(function template) [編集]
要素の範囲の次に小さい辞書順の順列を生成する
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)