Iterator eines std::unordered_map
-
Warum sind Zeilen 7 und 8 ein Problem??
Danke
#include <unordered_map> int main() { std::unordered_multimap<int,int> myumm({{1,3},{3,2},{5,5},{0,9}}); auto first = myumm.begin(); auto second = first+1; auto third = --myumm.end(); auto fourth = myumm.end(); }
-
Der Iterator einer std::unordered_multimap ist ein Forward-Iterator. Das bedeutet, dass der operator+ und das rückwärts iterieren nicht erlaubt sind.
-
Danke,
ich habe das erste Bsp. erweitert. Der Sinn dahinter ist immer 2 Elemente einer unordered_map mit den letzten beiden zu vergleichen. Wenn gleich, dann ist die Schleife zu Ende. Leider kompiliert das Bsp. nicht.
Wie würdet ihr iterieren?
#include <functional> #include <iostream> #include <boost/iterator/zip_iterator.hpp> #include <boost/tuple/tuple.hpp> int main() { std::unordered_multimap<int,int> myumm({{1,3},{3,2},{5,5},{0,9}}); auto first = myumm.begin(); auto second = std::next(first,1); auto third = std::next(first,myumm.size()-1); auto fourth = myumm.end(); std::for_each ( boost::make_zip_iterator ( boost::make_tuple(first,second) ) , boost::make_zip_iterator ( boost::make_tuple(third, fourth) ) , [] ( boost::tuple < std::unordered_multimap<int,int>::iterator , std::unordered_multimap<int,int>::iterator > const & _layout ) { } ); }Fehlermeldung
/usr/include/boost/tuple/detail/tuple_basic.hpp:310:37: error: no matching constructor for initialization of 'stored_head_type' (aka 'std::__detail::_Node_iterator<std::pair<const int, int>, false, false>') cons( const cons<HT2, TT2>& u ) : head(u.head), tail(u.tail) {}
-
Ich habe zwar keine Antwort auf die Frage, aber 2 Anmerkungen: erst mal solltest Du für C++-Code hier die C++-Code-Tags statt der einfachen Code-Tags verwenden. Und ausserdem liefert myumm.end() einen Iterator, der hinter das letzte Element zeigt. Das ist aber nicht das, was Du willst.
-
Ich kann mir auch grad nicht viele Anwendungsbeispiele vorstellen, wo es Sinn machen würde in einer unordered map ein Element mit seinen zwei "Vorgängern" zu vergleichen.
-
Zum Anwendungsfall:
Das erste Element des o.g. myumm ergibt mit dem Wert des Nächsten die Größe mehrerer Matrizen z.B. a0 = start->first X next->first, a1 = start->first X 1, ..., b0 = ++start->first X ++next->first, ..., usw.
-
goran schrieb:
Zum Anwendungsfall:
Das erste Element des o.g. myumm ergibt mit dem Wert des Nächsten die Größe mehrerer Matrizen z.B. a0 = start->first X next->first, a1 = start->first X 1, ..., b0 = ++start->first X ++next->first, ..., usw.Wie der Name sagt, sind die Elemente unsortiert, d.h. jedes mit jedem muss eine Matrix ergeben und auch noch sinnvoll sein. Damit willst du wohl eher ein Vector oder eine normale map.
-
Ein vector mit einem kleinen struct wäre auch i.O. Da hast du recht. Eine Map geht nicht, da eine Map die Werte sortieren würde. Ob die unordered_map Sinn macht wird an anderer Stelle geprüft.
-
goran schrieb:
Ob die unordered_map Sinn macht wird an anderer Stelle geprüft.
Verstehe ich nicht.
Dieunordered_mapkann keinen Sinn machen wenn du eine bestimmte Reihenfolge brauchst.
D.h. wennmapnicht geht weil es die Einträge sortiert (und damit deren Reihenfolge ändert), dann kannunordered_mapaus dem selben Grund nicht gehen.