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;
}
但标准库中是否有安全的替代方案?
答案 0 :(得分:18)
在C ++ 14中,标准库将包含一个std::equal
版本,它带有两对迭代器,类似于safe_equal
。 std::mismatch
和std::is_permutation
相同。
答案 1 :(得分:9)
vector
有一个运算符==,它首先检查大小。在您的示例中,只需使用条件v==w
。
答案 2 :(得分:1)
我自己想要这样的功能。我无法在标准库中找到任何设施。
如果你愿意使用助推器。 Boost.Range等于我认为你正在寻找的http://www.boost.org/doc/libs/1_53_0/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html
答案 3 :(得分:1)
我遇到了同样的问题并通过在相等之前检查向量的大小来解决它。
std::vector< int > v( 100 );
std::vector< int > w( 10 );
bool same = (v.size() == w.size()) && std::equal( v.begin(), v.end(), w.begin() );
答案 4 :(得分:0)
您还可以使用std::lexicographical_compare
两次来确定其中一个序列是否小于另一个序列。