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;
}
しかし、標準ライブラリに安全な代替手段はありますか?