C++14 2つの範囲をとるアルゴリズムに、2つ目の範囲の終端を与えるバージョンを追加

N3671 Making non-modifying sequence operations more robust: Revision 2


これまで、2つの範囲をとるアルゴリズムの設計では、1つ目の範囲は先頭と終端をとり、2つ目の範囲は先頭のみをとるようになっていました。

result_type algorithm(Iterator first1, Iterator last1, Iterator first2);

しかし、これが思わぬ事故を引き起こす場合があります。たとえば、2つの範囲が等しいかを判定するstd::equal()関数の場合、1つ目の範囲の方が要素数が多く、2つ目の範囲の要素数が少ないと、範囲外アクセスでクラッシュします。

equal(v1.begin(), v1.end(), v2.begin());

これは、2つ目の範囲の要素数が、先頭イテレータからはわからないためです。
こういう問題から、アルゴリズムに2つ目の範囲も終端を与えるバージョンが追加されます。std::equal()関数は、以下のように使用できるようになります。

equal(v1.begin(), v1.end(), v2.begin(), v2.end()); 


この変更が適用されるアルゴリズム一覧は、以下の通りです:

  • mismatch
  • equal
  • is_permutation