1. ホーム
  2. c++

[解決済み] std::equalに代わる安全な方法はありますか?

2022-02-20 22:10:45

質問

std::equal() は安全ではありません。なぜなら、この関数は比較される2番目のコンテナの長さをオーバーするかどうかを知ることができないからです。ということです。

std::vector< int > v( 100 );
std::vector< int > w( 10 );
bool same = std::equal( v.begin(), v.end(), w.begin() );

のバッファオーバーランが発生します。 w .

当然、これらをテストすることができます ( v.size() == w.size() ) が、Visual Studio 2010などのコンパイラは、この関数自体を安全でないと報告しています。そして実際、それは 様々な経験を積んだプログラマーが集まったチームでは、最終的にサイズを比較することを忘れてしまうからです。

安全な代替案は、実装が簡単である。

template< typename Iter1, typename Iter2 >
bool equal_safe( Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2 )
{
    while( begin1 != end1 && begin2 != end2 )
    {
        if( *begin1 != *begin2 )
        {
            return false;
        }
        ++begin1;
        ++begin2;
    }
    return begin1 == end1 && begin2 == end2;
}

しかし、標準ライブラリに安全な代替手段はないのでしょうか?

どのように解決するのですか?

C++14では、標準ライブラリに std::equal と同じように、2つのイテレータのペアを受け取ります。 safe_equal . 同じように std::mismatchstd::is_permutation .