std::equal()
jest niebezpieczne, ponieważ funkcja nie może wiedzieć, czy przekroczy ona długość drugiego porównywalnego pojemnika. To znaczy:Czy istnieje bezpieczna alternatywa dla std :: equal?
std::vector<int> v(100);
std::vector<int> w(10);
bool same = std::equal(v.begin(), v.end(), w.begin());
... spowoduje przepełnienie bufora dla w
.
Oczywiście możemy przetestować te rzeczy (v.size() == w.size()
), ale kompilatory takie jak Visual Studio 2010 nadal zgłaszają samą funkcję jako niebezpieczną. I rzeczywiście jest to niebezpieczne w pewnym fundamentalnym sensie: zespół programistów o różnych poziomach doświadczenia ostatecznie zapomni porównać rozmiary.
Bezpieczna alternatywa jest łatwa do wdrożenia.
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;
}
Ale czy istnieje bezpieczna alternatywa w standardowej bibliotece?
Bezpieczna alternatywa, aby zrobić dokładnie to, co? Po prostu porównaj dwa 'std :: vector's? Lub dwa zakresy iteracyjne? –
@ftfbit Aby zrobić to, co robi std :: equal(). Aby porównać dwa zakresy iteratorów. – OldPeculier
Łatwo jest napisać implementację safe_equal, jeśli == nie spełnia Twoich wymagań. –