【发布时间】:2013-04-25 21:47:17
【问题描述】:
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;
}
但是标准库中是否有安全的替代方案?
【问题讨论】:
-
安全的替代方法到底是什么?只比较两个
std::vectors?还是两个迭代器范围? -
@sftrabbit 做 std::equal() 所做的事情。比较两个迭代器范围。
-
如果 == 不满足您的要求,编写一个 safe_equal 实现很容易。
-
我不确定我是否同意这个评估,尽管我理解投诉:
std::equal基本上是一种在 迭代器范围 上工作的算法,就其本质而言,就像 all 范围内的其他 C++ 算法一样,算法不会检查这些范围。这一点在标准库中有压倒性的一致性,所以我认为很难出错。您将获得一个行为完全符合预期的统一界面。
标签: c++ stl containers stl-algorithm