6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["algorithm"], "namespace": ["std"], "id-type": ["function template"]}, "sources": [{"id": "e11448478d59a803eab835e51d930796d7df1b10", "source": "#include <algorithm>\n#include <iostream>\n#include <vector>\n#include <array>\n#include <iterator>\n\nint main() {\n std::vector<int> v = { 1,2,3,4,3,2 };\n std::array<int, 6> v2 = { 1,2,3,4,2,1 };\n\n // \u30b3\u30f3\u30c6\u30ca\u306e\u4e2d\u8eab\u304c\u540c\u3058\u304b\u3069\u3046\u304b\u8abf\u3079\u308b\n bool result = std::equal(std::begin(v), std::end(v), std::begin(v2), std::end(v2));\n std::cout << std::boolalpha << result << std::endl;\n\n // x\u00b11 \u306e\u8aa4\u5dee\u3092\u8a31\u3059\u3088\u3046\u306b\u3059\u308b\n bool result2 = std::equal(std::begin(v), std::end(v), std::begin(v2), std::end(v2),\n [](int x, int y) { return x - 1 <= y && y <= x + 1; });\n std::cout << std::boolalpha << result2 << std::endl;\n}\n"}], "page_id": ["reference", "algorithm", "equal"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["algorithm"], "namespace": ["std"], "id-type": ["function template"]}, "sources": [{"id": "e11448478d59a803eab835e51d930796d7df1b10", "source": "#include <algorithm>\n#include <iostream>\n#include <vector>\n#include <array>\n#include <iterator>\n\nint main() {\n std::vector<int> v = { 1,2,3,4,3,2 };\n std::array<int, 6> v2 = { 1,2,3,4,2,1 };\n\n // \u30b3\u30f3\u30c6\u30ca\u306e\u4e2d\u8eab\u304c\u540c\u3058\u304b\u3069\u3046\u304b\u8abf\u3079\u308b\n bool result = std::equal(std::begin(v), std::end(v), std::begin(v2), std::end(v2));\n std::cout << std::boolalpha << result << std::endl;\n\n // x\u00b11 \u306e\u8aa4\u5dee\u3092\u8a31\u3059\u3088\u3046\u306b\u3059\u308b\n bool result2 = std::equal(std::begin(v), std::end(v), std::begin(v2), std::end(v2),\n [](int x, int y) { return x - 1 <= y && y <= x + 1; });\n std::cout << std::boolalpha << result2 << std::endl;\n}\n"}, {"id": "0f83917d8a918c8f5c36b89e72c4832611f52f31", "source": "#include <algorithm>\n#include <iostream>\n#include <vector>\n\nint main() {\n std::vector<int> v1 = { 1, 2, 3 };\n std::vector<int> v2 = { 1, 2, 3, 4 };\n std::vector<int> v3 = { 1, 2 };\n\n std::cout << std::boolalpha;\n\n // v2\u306fv1\u3068\u540c\u3058\u304b\u305d\u308c\u4ee5\u4e0a\u306e\u8981\u7d20\u6570\u3092\u3082\u3064\u3053\u3068\u304c\u308f\u304b\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u5b89\u5168\u306b\u4f7f\u7528\u3067\u304d\u308b\n std::cout << std::equal(v1.begin(), v1.end(), v2.begin()) << std::endl;\n\n // \u5371\u967a\u306a\u4f8b\u3002\n // v3\u306e\u8981\u7d20\u6570\u306fv1\u3088\u308a\u5c11\u306a\u3044\u305f\u3081\u3001v3\u306e\u7bc4\u56f2\u5916\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001\u52d5\u4f5c\u306f\u672a\u5b9a\u7fa9\u3068\u306a\u308b\n // std::cout << std::equal(v1.begin(), v1.end(), v3.begin()) << std::endl;\n\n // \u7d42\u7aef\u3092\u6307\u5b9a\u3059\u308b(3)\u3067\u3042\u308c\u3070\u3001\u8981\u7d20\u6570\u304c\u7570\u306a\u308b\u3053\u3068\u3092\u691c\u51fa\u3057\u3066false\u3092\u8fd4\u3059\n std::cout << std::equal(v1.begin(), v1.end(), v3.begin(), v3.end()) << std::endl;\n}\n"}], "page_id": ["reference", "algorithm", "equal"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
189189 < p class ="text-right "> < small >
190190 最終更新日時:
191191 < time itemprop ="datePublished " class ="js-local-time "
192- datetime ="2026-08-25T12:11:17 +09:00 ">
193- 2026年08月25日 12時11分17秒 (JST)
192+ datetime ="2026-09-11T12:03:49 +09:00 ">
193+ 2026年09月11日 12時03分49秒 (JST)
194194 </ time >
195195 < br />
196196 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -328,6 +328,11 @@ <h2>概要</h2>
328328</ ul >
329329< p > 2つの< a class ="cpprefjp-defined-word " data-desc ="2つのイテレータで表現される半開区間を表す。C++20からイテレータと番兵で異なる型であっても指定可能になる "> イテレータ範囲</ a > が異なる要素数であった場合、< code > false</ code > を返す。</ p >
330330< p > 2つの< a class ="cpprefjp-defined-word " data-desc ="2つのイテレータで表現される半開区間を表す。C++20からイテレータと番兵で異なる型であっても指定可能になる "> イテレータ範囲</ a > が要素数および各要素が等値であった場合、< code > true</ code > を返す。</ p >
331+ < h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Preconditions。関数呼び出し時に満たされていると関数が想定する条件。満たさなければ未定義の動作。契約属性の`[[expects]]`に相当 "> 事前条件</ a > </ h2 >
332+ < ul >
333+ < li > (1), (2), (5), (6) : < code > [first2, first2 + (last1 - first1))</ code > が妥当な< a class ="cpprefjp-defined-word " data-desc ="2つのイテレータで表現される半開区間を表す。C++20からイテレータと番兵で異なる型であっても指定可能になる "> イテレータ範囲</ a > であること</ li >
334+ < li > (3), (4), (7), (8) : < code > [first2, last2)</ code > が妥当な< a class ="cpprefjp-defined-word " data-desc ="2つのイテレータで表現される半開区間を表す。C++20からイテレータと番兵で異なる型であっても指定可能になる "> イテレータ範囲</ a > であること</ li >
335+ </ ul >
331336< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > </ h2 >
332337< p > < code > last2</ code > が与えられている形式の場合、もし < code > last1 - first1 != last2 - first2</ code > であれば、< code > false</ code > を返す。< br />
333338そうでない場合、< code > [first1,last1)</ code > 内のイテレータ < code > i</ code > について、< code > *i == *(first2 + (i - first1))</ code > もしくは < code > pred(*i, *(first2 + (i - first1))) != false</ code > が全てのイテレータ < code > i</ code > について満たされているのであれば < code > true</ code > を返す。< br />
@@ -340,9 +345,15 @@ <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成
340345</ ul >
341346< h2 > 備考</ h2 >
342347< ul >
348+ < li > (1), (2), (5), (6) : これらの< a class ="cpprefjp-defined-word " data-desc ="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合 "> オーバーロード</ a > は、< code > first2</ code > から始まる範囲の長さを検査しない。< code > first2</ code > 側の要素数が< code > [first1, last1)</ code > の要素数より少ない場合、範囲外アクセスによって< a class ="cpprefjp-defined-word " data-desc ="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="../../implementation-compliance.html#dfn-undefined-behavior "> 動作は未定義</ a > となり、クラッシュする可能性がある< ul >
349+ < li > < code > first2</ code > 側の範囲が< code > [first1, last1)</ code > と同じかそれ以上の要素数をもつことが保証できない場合は、範囲の終端< code > last2</ code > を受け取る(3), (4)を使用すること。(3), (4)は要素数が異なる場合に< code > false</ code > を返す</ li >
350+ </ ul >
351+ </ li >
343352< li > ランダムアクセスイテレータの範囲を使用する場合、状況によっては(1), (2)のバージョンよりも、(3), (4)を使用する方が効率がよくなることが期待できる。ランダムアクセスイテレータはイテレータ同士の差を定数時間で求められるため、イテレーションを行うことなく2つの範囲の要素数が異なることを検出できるためである</ li >
344353</ ul >
345354< h2 > 例</ h2 >
355+ < h3 > 基本的な使い方 ((3), (4))</ h3 >
356+ < p > 2つの< a class ="cpprefjp-defined-word " data-desc ="2つのイテレータで表現される半開区間を表す。C++20からイテレータと番兵で異なる型であっても指定可能になる "> イテレータ範囲</ a > の終端をどちらも指定するバージョンである。要素数が異なる場合は< code > false</ code > を返す。</ p >
346357< p > < div class ="yata " id ="e11448478d59a803eab835e51d930796d7df1b10 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../algorithm.html "> <algorithm></ a > </ span >
347358< span class ="cp "> #include < a href ="../iostream.html "> <iostream></ a > </ span >
348359< span class ="cp "> #include < a href ="../vector.html "> <vector></ a > </ span >
@@ -364,10 +375,39 @@ <h2>例</h2>
364375< span class ="p "> }</ span >
365376</ code > </ pre > </ div >
366377</ div > </ p >
367- < h3 > 出力</ h3 >
378+ < h4 > 出力</ h4 >
368379< p > < pre > < code > false
369380true
370381</ code > </ pre > </ p >
382+ < h3 > 片方の< a class ="cpprefjp-defined-word " data-desc ="2つのイテレータで表現される半開区間を表す。C++20からイテレータと番兵で異なる型であっても指定可能になる "> イテレータ範囲</ a > の終端を指定しない場合 ((1), (2))</ h3 >
383+ < p > < code > first2</ code > から始まる範囲の終端を指定しないバージョンである。この範囲の長さは検査されないため、< code > first2</ code > 側の要素数が足りない場合は範囲外アクセスとなり、< a class ="cpprefjp-defined-word " data-desc ="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="../../implementation-compliance.html#dfn-undefined-behavior "> 動作は未定義</ a > となる。</ p >
384+ < p > < div class ="yata " id ="0f83917d8a918c8f5c36b89e72c4832611f52f31 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../algorithm.html "> <algorithm></ a > </ span >
385+ < span class ="cp "> #include < a href ="../iostream.html "> <iostream></ a > </ span >
386+ < span class ="cp "> #include < a href ="../vector.html "> <vector></ a > </ span >
387+
388+ < span class ="kt "> int</ span > < span class ="w "> </ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span > < span class ="w "> </ span > < span class ="p "> {</ span >
389+ < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector.html "> std::vector</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="n "> v1</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="mi "> 2</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="mi "> 3</ span > < span class ="w "> </ span > < span class ="p "> };</ span >
390+ < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector.html "> std::vector</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="n "> v2</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="mi "> 2</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="mi "> 3</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="mi "> 4</ span > < span class ="w "> </ span > < span class ="p "> };</ span >
391+ < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector.html "> std::vector</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="n "> v3</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="mi "> 2</ span > < span class ="w "> </ span > < span class ="p "> };</ span >
392+
393+ < span class ="w "> </ span > < span class ="n "> < a href ="../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../ios/boolalpha.html "> std::boolalpha</ a > </ span > < span class ="p "> ;</ span >
394+
395+ < span class ="w "> </ span > < span class ="c1 "> // v2はv1と同じかそれ以上の要素数をもつことがわかっているため、安全に使用できる</ span >
396+ < span class ="w "> </ span > < span class ="n "> < a href ="../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < span style ="color:#ff0000 "> std::equal</ span > </ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../vector/vector/begin.html "> v1.begin()</ a > </ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector/end.html "> v1.end()</ a > </ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector/begin.html "> v2.begin()</ a > </ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../ostream/endl.html "> std::endl</ a > </ span > < span class ="p "> ;</ span >
397+
398+ < span class ="w "> </ span > < span class ="c1 "> // 危険な例。</ span >
399+ < span class ="w "> </ span > < span class ="c1 "> // v3の要素数はv1より少ないため、v3の範囲外にアクセスし、動作は未定義となる</ span >
400+ < span class ="w "> </ span > < span class ="c1 "> // < a href ="../iostream/cout.html "> std::cout</ a > << < span style ="color:#ff0000 "> std::equal</ span > (< a href ="../vector/vector/begin.html "> v1.begin()</ a > , < a href ="../vector/vector/end.html "> v1.end()</ a > , < a href ="../vector/vector/begin.html "> v3.begin()</ a > ) << < a href ="../ostream/endl.html "> std::endl</ a > ;</ span >
401+
402+ < span class ="w "> </ span > < span class ="c1 "> // 終端を指定する(3)であれば、要素数が異なることを検出してfalseを返す</ span >
403+ < span class ="w "> </ span > < span class ="n "> < a href ="../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < span style ="color:#ff0000 "> std::equal</ span > </ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../vector/vector/begin.html "> v1.begin()</ a > </ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector/end.html "> v1.end()</ a > </ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector/begin.html "> v3.begin()</ a > </ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../vector/vector/end.html "> v3.end()</ a > </ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../ostream/endl.html "> std::endl</ a > </ span > < span class ="p "> ;</ span >
404+ < span class ="p "> }</ span >
405+ </ code > </ pre > </ div >
406+ </ div > </ p >
407+ < h4 > 出力</ h4 >
408+ < p > < pre > < code > true
409+ false
410+ </ code > </ pre > </ p >
371411< h2 > 実装例</ h2 >
372412< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> InputIterator1</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> InputIterator2</ span > < span class ="o "> ></ span >
373413< span class ="kt "> bool</ span > < span class ="w "> </ span > < span class ="n "> equal</ span > < span class ="p "> (</ span > < span class ="n "> InputIterator1</ span > < span class ="w "> </ span > < span class ="n "> first1</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> InputIterator1</ span > < span class ="w "> </ span > < span class ="n "> last1</ span > < span class ="p "> ,</ span >
0 commit comments