El siguiente ejemplo mínimo:iteradores bidireccionales en unordered_map?
#include <iostream>
#include <boost/unordered_map.hpp>
int main()
{
boost::unordered_map<int, int> m;
boost::unordered_map<int, int>::const_iterator i;
m.insert(std::make_pair(1, 2));
i = m.end();
--i;
std::cout << i->first << " -> " << i->second << std::endl;
return 0;
}
... falla al compilar.
bidi.cxx: In function ‘int main()’:
bidi.cxx:13: error: no match for ‘operator--’ in ‘--i’
Según Boost's own documentation:
iterator
,const_iterator
son de al menos la categoría adelante.
Parecería que eso es todo lo que son. ¿Por qué? ¿Qué restricción técnica impone un hash-map que impide que los iteradores sean bidireccionales?
(gcc versión 4.1.2, Boost versiones 1.40.0 y 1.43.0.)
Esto es pura especulación, pero ten en cuenta que para poder atravesar algo hacia atrás Y hacia adelante, cada nodo necesitaría tener un puntero al siguiente elemento Y al elemento anterior. Si este mapa se implementara SOLAMENTE con punteros a los siguientes elementos, entonces su iterador no tendría forma de descubrir qué ocurría antes del nodo actual, y por lo tanto no hay forma de ir hacia atrás. –
Honestamente, me parece un poco extraño (aunque de vez en cuando útil) que los mapas desordenados incluso tengan iteradores. –
@Niki Yoshiuchi: He usado mucho el concepto correspondiente en Perl. Por lo general, quiero que los hashes de Perl funcionen como matrices asociativas, pero a veces quiero hacer algo con todo el hash. En Perl, utilizo la función 'keys' para obtener una lista de las claves y recorrerla, mientras que en C++ la equivalencia obvia es un iterador directo. Realmente extrañaría la posibilidad de hacer el equivalente de 'foreach' en cualquier colección de datos. –