geeksforgeeks c++ stl containers stl-algorithm

geeksforgeeks - stl c++



¿Hay una alternativa segura a std:: equal? (5)

Yo también quería esa característica. No he podido encontrar ninguna instalación en la biblioteca estándar.

Si estás dispuesto a usar boost Boost.Range tiene igual, creo que es lo que estás buscando http://www.boost.org/doc/libs/1_53_0/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html

std::equal() no es seguro porque la función no puede saber si rebasará la longitud del segundo contenedor que se va a comparar. Es decir:

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

... dará como resultado un desbordamiento del búfer para w .

Naturalmente, podemos probar estas cosas ( v.size() == w.size() ), pero los compiladores como Visual Studio 2010 todavía informan que la función en sí misma no es segura. Y, de hecho, no es seguro en un sentido fundamental: un equipo de programadores de diferentes niveles de experiencia se olvidará eventualmente de comparar tamaños.

Una alternativa segura es fácil de implementar.

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

Pero, ¿hay una alternativa segura en la biblioteca estándar?


vector tiene un operador == que primero verifica el tamaño. En su ejemplo, simplemente use la condición v==w .


En C ++ 14, la biblioteca estándar contendrá una versión de std::equal que toma dos pares de iteradores, similar a su safe_equal . Lo mismo para std::mismatch y std::is_permutation .


Tengo el mismo problema y lo solucioné al verificar el tamaño del vector antes de igual.

std::vector< int > v( 100 ); std::vector< int > w( 10 ); bool same = (v.size() == w.size()) && std::equal( v.begin(), v.end(), w.begin() );


También puede usar std::lexicographical_compare dos veces para determinar si cualquiera de las secuencias es menor que la otra.