是否有一个安全的替代std :: equal?

Old*_*ier 18 c++ containers stl stl-algorithm

std::equal()是不安全的,因为该函数无法知道它是否会超出要比较的第二个容器的长度.那是:

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

...将导致缓冲区溢出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;
}
Run Code Online (Sandbox Code Playgroud)

但标准库中是否有安全的替代方案?

Mar*_*low 19

在C++ 14中,标准库将包含一个版本,std::equal它需要两对迭代器,类似于你的safe_equal.同样的std::mismatchstd::is_permutation.


hus*_*had 9

vector有一个运算符==首先检查大小.在您的示例中,只需使用条件v==w.

  • @OldPeculier,我相信所有的STL容器都有一个以这种方式运行的operator ==.如果您的问题是您是否可以为任意迭代器执行此操作,则答案是否定的,因为无法仅基于序列中的单个迭代器来了解序列的长度. (5认同)