std::equal()
是不安全的,因为该函数无法知道它是否会超出要比较的第二个容器的长度。那是:
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;
}
但是标准库中有安全的替代方案吗?