std:: equal
|
ヘッダーで定義
<algorithm>
|
||
|
template
<
class
InputIt1,
class
InputIt2
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(1) | (constexpr since C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
bool
equal
(
ExecutionPolicy
&&
policy,
|
(2) | (since C++17) |
|
template
<
class
InputIt1,
class
InputIt2,
class
BinaryPred
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(3) | (constexpr since C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(4) | (since C++17) |
|
template
<
class
InputIt1,
class
InputIt2
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(5) |
(since C++14)
(constexpr since C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
bool
equal
(
ExecutionPolicy
&&
policy,
|
(6) | (since C++17) |
|
template
<
class
InputIt1,
class
InputIt2,
class
BinaryPred
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(7) |
(since C++14)
(constexpr since C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(8) | (since C++17) |
[
first1
,
last1
)
の範囲と
first2
から始まる範囲が等しいかどうかをチェックします:
- オーバーロード (1-4) の場合、第2の範囲は std:: distance ( first1, last1 ) 個の要素を持ちます。
-
オーバーロード
(5-8)
の場合、第2の範囲は
[first2,last2)です。
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> が true であること。 |
(C++20まで) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> が true であること。 |
(C++20以降) |
目次 |
パラメータ
| first1, last1 | - | 比較する最初の要素の範囲を定義するイテレータのペア |
| first2, last2 | - | 比較する2番目の要素の範囲を定義するイテレータのペア |
| policy | - | 使用する実行ポリシー |
| p | - |
要素が等しいと扱われるべき場合に
true
を返す二項述語。
述語関数のシグネチャは以下と同等であるべき: bool pred ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく(おそらくconstの)型
|
| 型要件 | ||
-
InputIt1, InputIt2
は
LegacyInputIterator
の要件を満たさなければならない。
|
||
-
ForwardIt1, ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければならない。
|
||
-
BinaryPred
は
BinaryPredicate
の要件を満たさなければならない。
|
||
戻り値
計算量
N 1 を std:: distance ( first1, last1 ) として、 N 2 を std:: distance ( first2, last2 ) として定義する:
InputIt1
と
InputIt2
が両方とも
LegacyRandomAccessIterator
であり、かつ
last1
-
first1
!
=
last2
-
first2
が
true
の場合、比較は行われません。
例外
ExecutionPolicy
という名前のテンプレートパラメータを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出される。それ以外のExecutionPolicyについては、動作は実装定義である。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされる。
実装例
| equal (1) |
|---|
template<class InputIt1, class InputIt2> constexpr //< since C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2) { for (; first1 != last1; ++first1, ++first2) if (!(*first1 == *first2)) return false; return true; } |
| equal (3) |
| イコール (3) |
template<class InputIt1, class InputIt2, class BinaryPred> constexpr //< since C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p) { for (; first1 != last1; ++first1, ++first2) if (!p(*first1, *first2)) return false; return true; } |
| equal (5) |
namespace detail { // ランダムアクセスイテレータの実装(範囲サイズの高速検出を可能にする) template<class RandomIt1, class RandomIt2> constexpr //< C++20以降 bool equal(RandomIt1 first1, RandomIt1 last1, RandomIt2 first2, RandomIt2 last2, std::random_access_iterator_tag, std::random_access_iterator_tag) { if (last1 - first1 != last2 - first2) return false; for (; first1 != last1; ++first1, ++first2) if (!(*first1 == *first2)) return false; return true; } // 入力イテレータの実装(「last2」との手動比較が必要) template<class InputIt1, class InputIt2> constexpr //< C++20以降 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, std::input_iterator_tag, std::input_iterator_tag) { for (; first1 != last1 && first2 != last2; ++first1, ++first2) if (!(*first1 == *first2)) return false; return first1 == last1 && first2 == last2; } } template<class InputIt1, class InputIt2> constexpr //< C++20以降 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) { details::equal(first1, last1, first2, last2, typename std::iterator_traits<InputIt1>::iterator_category(), typename std::iterator_traits<InputIt2>::iterator_category()); } |
| equal (7) |
namespace detail { // ランダムアクセスイテレータの実装(範囲サイズの高速検出を可能にする) template<class RandomIt1, class RandomIt2, class BinaryPred> constexpr //< C++20以降 bool equal(RandomIt1 first1, RandomIt1 last1, RandomIt2 first2, RandomIt2 last2, BinaryPred p, std::random_access_iterator_tag, std::random_access_iterator_tag) { if (last1 - first1 != last2 - first2) return false; for (; first1 != last1; ++first1, ++first2) if (!p(*first1, *first2)) return false; return true; } // 入力イテレータの実装(「last2」との手動比較が必要) template<class InputIt1, class InputIt2, class BinaryPred> constexpr //< C++20以降 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p, std::input_iterator_tag, std::input_iterator_tag) { for (; first1 != last1 && first2 != last2; ++first1, ++first2) if (!p(*first1, *first2)) return false; return first1 == last1 && first2 == last2; } } template<class InputIt1, class InputIt2, class BinaryPred> constexpr //< C++20以降 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p) { details::equal(first1, last1, first2, last2, p, typename std::iterator_traits<InputIt1>::iterator_category(), typename std::iterator_traits<InputIt2>::iterator_category()); } |
注記
std::equal
は、
std::unordered_set
、
std::unordered_multiset
、
std::unordered_map
、または
std::unordered_multimap
のイテレータによって形成される範囲を比較するために使用すべきではありません。なぜなら、これらのコンテナに格納される要素の順序は、たとえ2つのコンテナが同じ要素を格納している場合でも異なる可能性があるためです。
コンテナ全体 または文字列ビュー (C++17以降) の等価性を比較する場合、 operator == が通常推奨されます。
シーケンシャルな
std::equal
は短絡評価が保証されていません。例えば、両範囲の最初の要素ペアが等しく比較されない場合でも、残りの要素も比較される可能性があります。非短絡比較は、範囲が
std::memcmp
または実装固有のベクトル化アルゴリズムで比較される場合に発生する可能性があります。
例
以下のコードは
std::equal
を使用して、文字列が回文かどうかをテストします。
#include <algorithm> #include <iomanip> #include <iostream> #include <string_view> constexpr bool is_palindrome(const std::string_view& s) { return std::equal(s.cbegin(), s.cbegin() + s.size() / 2, s.crbegin()); } void test(const std::string_view& s) { std::cout << std::quoted(s) << (is_palindrome(s) ? " is" : " is not") << " a palindrome\n"; } int main() { test("radar"); test("hello"); }
出力:
"radar" is a palindrome "hello" is not a palindrome
関連項目
|
(C++11)
|
特定の条件を満たす最初の要素を見つける
(関数テンプレート) |
|
一方の範囲が他方よりも辞書順で小さい場合に
true
を返す
(関数テンプレート) |
|
|
二つの範囲が最初に異なる位置を見つける
(関数テンプレート) |
|
|
要素の範囲の最初の出現を検索する
(関数テンプレート) |
|
|
(C++20)
|
二つの要素の集合が同じかどうかを判定する
(アルゴリズム関数オブジェクト) |
|
x
==
y
を実装する関数オブジェクト
(クラステンプレート) |
|
|
特定のキーに一致する要素の範囲を返す
(関数テンプレート) |