Por definición, el algoritmo std :: equal solo toma un 'último' iterador. Muchas publicaciones en stackoverflow indican que para realizar la equivalencia entre dos rangos, primero se debe verificar que los rangos tengan el mismo tamaño además de llamar a std :: equal. Si los iteradores de acceso aleatorio están disponibles, esto no agrega ninguna sobrecarga de material. Sin embargo, parece que sin los iteradores de acceso aleatorio, el primer fragmento de código, implementado solo con los algoritmos STL existentes, será más lento que el segundo fragmento de código, que representa un algoritmo "equivalente" personalizado (no parte de STL). Mi pregunta es, ¿el fragmento 2 es más eficiente que cualquier algoritmo codificado solo con los algoritmos STL existentes? Si es así, ¿por qué este algoritmo no es parte de STL?Algoritmo STL para rangos equivalentes
Fragmento 1:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return distance(first1, last1) == distance(first2, last2) &&
equal(first1, last1, first2);
}
Fragmento 2:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
while (first1 != last1 && first2 != last2) {
if (!(*first1 == *first2)) return false;
++first1; ++first2;
}
return first1 == last1 && first2 == last2;
}
Nota: No he comprobado, pero yo sería muy dudoso que el compilador optimizará el fragmento 1 tal que produce código con el mismo rendimiento producido por el fragmento 2.
Para completar, el siguiente fragmento de código es inútil, ya que fallará si los tamaños del rango no son iguales:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return equal(first1, last1, first2) && equal(first2, last2, first1);
}
El problema es que no sé si las longitudes de rango son las mismas y verificar que coincidan con los costos de tiempo de ejecución. – MarkB
No importa, no me di cuenta de que esas eran * alternativas *. Fragmento 2 se ve bien, y como la mejor solución. –