Il seguente esempio minimale:iteratori bidirezionali in 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;
}
... fallisce la compilazione.
bidi.cxx: In function ‘int main()’:
bidi.cxx:13: error: no match for ‘operator--’ in ‘--i’
Secondo Boost's own documentation:
iterator
,const_iterator
sono almeno della categoria in avanti.
Sembrerebbe che sia tutto ciò che sono. Perché? Quale restrizione tecnica impone una mappa hash che impedisce agli iteratori di essere bidirezionali?
(gcc version 4.1.2, Boost versioni 1.40.0 e 1.43.0.)
Questa è pura speculazione, ma tieni presente che puoi essere in grado di attraversare qualcosa all'indietro e in avanti, quindi ogni nodo dovrebbe avere un puntatore all'elemento successivo E all'elemento precedente. Se questa mappa fosse implementata con SOLO puntatori agli oggetti successivi, allora il tuo iteratore non avrebbe modo di capire cosa succedeva prima del nodo corrente, e quindi non c'era modo di tornare indietro. –
Sinceramente trovo strano (anche se occasionalmente utile) che le mappe non ordinate abbiano anche iteratori. –
@Niki Yoshiuchi: Ho usato molto il concetto corrispondente in Perl. Di solito, voglio che gli hash del Perl funzionino come array associativi, ma a volte voglio fare qualcosa per l'intero hash. In Perl, uso la funzione 'keys' per ottenere una lista delle chiavi, e iterare attraverso di essa, mentre in C++ l'ovvia equivalenza è un iteratore diretto. Mi mancherebbe davvero la possibilità di fare l'equivalente di 'foreach' su qualsiasi raccolta di dati. –