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