22

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;
}

しかし、標準ライブラリに安全な代替手段はありますか?

4

5 に答える 5

22

C++14 では、標準ライブラリに のバージョンとstd::equal同様に、2 組のイテレータを使用するバージョンが含まれますsafe_equalstd::mismatchと についても同じですstd::is_permutation

于 2013-05-02T00:09:22.077 に答える
9

vector最初にサイズをチェックする operator== があります。あなたの例では、条件を使用してくださいv==w

于 2013-05-01T20:30:39.137 に答える
1

私自身、そのような機能が欲しかったのです。標準ライブラリで機能を見つけることができませんでした。

ブーストを使用する意思がある場合。Boost.Range には、あなたが探しているものがあると思います

于 2013-05-01T21:07:45.567 に答える
1

また、two を使用std::lexicographical_compareして、どちらかのシーケンスが他方よりも小さいかどうかを判断することもできます。

于 2014-06-05T09:28:34.677 に答える