定義により、std :: equalアルゴリズムは1つの '最後の'イテレータしか使用しません。 stackoverflow上の多くのポストは、2つの範囲間の等価性を実行するために、std :: equalを呼び出すことに加えて、範囲が同じサイズであることを最初にチェックする必要があることを示しています。ランダムアクセス反復子が利用可能な場合、これは実質的なオーバーヘッドを追加しません。しかし、ランダムアクセスイテレータがなければ、既存のSTLアルゴリズムのみで実装された最初のコードフラグメントは、カスタムの "等価"アルゴリズム(STLの一部ではない)を表す2番目のコードフラグメントよりも遅くなるようです。私の質問は、フラグメント2は、既存のSTLアルゴリズムを使用してのみコーディングされたアルゴリズムよりも効率的ですか?もしそうなら、なぜこのアルゴリズムはSTLの一部ではないのですか?同等の範囲のSTLアルゴリズム
断片1:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return distance(first1, last1) == distance(first2, last2) &&
equal(first1, last1, first2);
}
フラグメント2:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
while (first1 != last1 && first2 != last2) {
if (!(*first1 == *first2)) return false;
++first1; ++first2;
}
return first1 == last1 && first2 == last2;
}
注:私はそれをチェックしていないが、私は、コンパイラは、それが生成する1ようなフラグメントを最適化することは非常に疑わしいでしょうコードでは、フラグメント2で生成されたものと同じパフォーマンスが得られます。
次のコード部分は、範囲サイズが等しくない場合に失敗するため、無用です。
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return equal(first1, last1, first2) && equal(first2, last2, first1);
}
問題は、範囲の長さが同じで、コストがランタイムと一致するかどうかを確認できないことです。 – MarkB
心配しないで、私はそれらが*代替案であることを認識しませんでした。断片2はよく見え、最良の解決策のようです。 –