Das folgende minimal Beispiel:Bidirektionale Iteratoren 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;
}
... nicht kompilieren.
bidi.cxx: In function ‘int main()’:
bidi.cxx:13: error: no match for ‘operator--’ in ‘--i’
Nach Boost's own documentation:
iterator
,const_iterator
sind zumindest die Vorwärts-Kategorie.
Es scheint, dass das alles ist, was sie sind. Warum? Welche technische Einschränkung gibt eine Hash-Map vor, die verhindert, dass Iteratoren bidirektional sind?
(gcc Version 4.1.2, Boost-Versionen 1.40.0 und 1.43.0.)
Das ist pure Spekulation, aber bedenken Sie, dass Sie in der Lage sind, etwas rückwärts und vorwärts zu durchlaufen, dann müsste jeder Knoten einen Zeiger auf das nächste Element und das vorherige Element haben. Wenn diese Map mit ONLY-Zeigern auf die nächsten Elemente implementiert würde, hätte Ihr Iterator keine Möglichkeit, herauszufinden, was vor dem aktuellen Knoten lag, und somit keine Möglichkeit, rückwärts zu gehen. –
Ehrlich gesagt finde ich es merkwürdig (obwohl gelegentlich nützlich), dass unordered_maps sogar Iteratoren haben. –
@ Niki Yoshiuchi: Ich habe das entsprechende Konzept in Perl sehr oft verwendet. Normalerweise möchte ich, dass Perl-Hashes als assoziative Arrays fungieren, aber manchmal möchte ich etwas mit dem gesamten Hash tun. In Perl verwende ich die 'keys' -Funktion, um eine Liste der Schlüssel zu erhalten, und iteriere durch sie, während in C++ die offensichtliche Äquivalenz ein Vorwärtsiterator ist. Ich würde wirklich die Fähigkeit vermissen, das Äquivalent zu foreach bei jeder Datensammlung zu machen. –