22

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

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

4

5 回答 5

22

在 C++14 中,标准库将包含一个带有std::equal两对迭代器的版本,类似于您的safe_equal. std::mismatch和相同std::is_permutation

于 2013-05-02T00:09:22.077 回答
9

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

于 2013-05-01T20:30:39.137 回答
1

我自己也想要这样的功能。我无法在标准库中找到任何设施。

如果你愿意使用boost。我认为 Boost.Range 是你正在寻找的http://www.boost.org/doc/libs/1_53_0/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html

于 2013-05-01T21:07:45.567 回答
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() );
于 2014-03-28T10:48:49.833 回答
1

您还可以使用std::lexicographical_compare两次来确定任一序列是否小于另一个。

于 2014-06-05T09:28:34.677 回答