std::unordered_map nicht möglich mit std:pair (uach nicht mit make_pair)
-
Hallo,
ich habe eine unordered_map, welche ich mittlerweile recht nervig finde zu bedienen mittels std:pair und make_pair (utility).
Zunöchst eine kleine typedef:
typedef int64_t LngLngInt;Dann habe ich folgende unordered_map:
std::unordered_map<LngLngInt, X_Ptr> * _uMap = new std::unordered_map<LngLngInt, X_Ptr>();Das getKey() hat folgende Signatur:
LngLngInt getKey() const;Das X_Ptr ist bekannt aus: https://www.c-plusplus.net/forum/p2447408#2447408
Die Map möchte ich mit paaren füllen:
X_Ptr x_ptr; LngLngInt lli = getKey(); std::pair<LngLngInt, X_Ptr> insertingPair( fid, *x_ptr ); _uMap->insert( insertingPair );Alles grün bis auf die Zeile mit insert. Da ich bekomme äußerst unangenehme:
1C:\MyProjects\converter.cpp:205: Fehler: invalid user-defined conversion from 'std::pair<long long int, X_Ptr>' to 'const value_type& {aka const std::pair<const long long int, X_Ptr>&}' [-fpermissive]
_uMap->insert( insertingPair );2
C:\MyProjects\comverter.cpp:205: Fehler: invalid conversion from 'std::pair<long long int, X_Ptr>' to 'std::pair<long long int, X_Ptr>&&' [-fpermissive]
_uMap->insert( insertingPair );3
C:\MyProjects\converter.cpp:205: Fehler: cannot convert 'insertingPair' from type 'std::pair<long long int, X_Ptr>' to type 'std::pair<long long int, X_Ptr>&&'
X_Ptr->insert( insertingPair );
^Hat jemand einen Tipp für mich?
Ich danke im voraus und schönen Sonntag abend noch
VG Lespaul
-
Einfach:
_uMap->emplace(LngLngInt, X_Ptr);Die Map definiert ihren value_type so:
typedef pair<const Key, T> value_type;bei dir fehlt das const.
Warum um alles in der Welt ist die Map Heapallokiert?
-
lespaul schrieb:
Dann habe ich folgende unordered_map:
std::unordered_map<LngLngInt, X_Ptr> * _uMap = new std::unordered_map<LngLngInt, X_Ptr>();Das ist ja schon einmal hochgradig ungewöhnlich. Kommst du von Java? Wieso nutzt du new, noch dazu mit einem rohen Zeiger?
Die Map möchte ich mit paaren füllen:
X_Ptr x_ptr; LngLngInt lli = getKey(); std::pair<LngLngInt, X_Ptr> insertingPair( fid, *x_ptr ); _uMap->insert( insertingPair );Wenn x_ptr ein X_Ptr ist, was ist dann *x_ptr? Das kann eigentlich gar nicht compilieren. Und zwar schon vor dem insert. "Programmierst" du etwa hier im Foreneditor, anstatt Copy&Paste zu benutzen?
Wird x_ptr gar nicht initialisiert?
Hat jemand einen Tipp für mich?
Warum so kompliziert mit so vielen Indirektionen?
std::unordered_map<LngLngInt, X_Ptr> _uMap; _uMap.emplace(getKey(), X_Ptr());Auch wenn dies die technisch richtige Umsetzung ist von dem, was dein Code versuchte, so ist dies doch trotzdem noch ein eher merkwürdiges Vorhaben. Falls dein Code tatsächlich dies oder ähnliches versucht, solltest du noch einmal nachdenken, ob das wirklich Sinn macht.
-
Das emplace ist gelb unterstrichelt mit dem Wanr-Hinweis "Zu viele Argumente"
Aber es funzt schonmal, thnx.
manni66 schrieb:
Warum um alles in der Welt ist die Map Heapallokiert?
Ich übergebe den Zeiger auf das unordered_map später an eine andere Klasse zur Auswertung.
Ich habe mir mal die unorderd map ausgeben lassen. In einer Schleife schiebe ich als Key long long int Werte rein. Als Value jedesmal andere X_Ptr objekte.
Dabei lasse ich per & die Adresse der X_Ptr ausgeben. Mir fällt auf, dass die X_Ptr in der unordered_map alle die gleoiche Adresse haben?ID 456834 Adresse: 0x229170
ID 66456862 Adresse: 0x229170
ID 20129064 Adresse: 0x229170
ID 276636190 Adresse: 0x229170
ID 76357877784 Adresse: 0x229170
ID 76636160 Adresse: 0x229170
ID 2357877788 Adresse: 0x229170
ID 6164 Adresse: 0x229170
ID 2344053282 Adresse: 0x229170
ID 116456854 Adresse: 0x229170
-
SeppJ schrieb:
Java? Wieso nutzt du new, noch dazu mit einem rohen Zeiger?
Warum rohe Zeiger? Jedes Kind weiß, wenn man Zeiger kocht, gehen die Vitamine verloren.
Was hätt ich stattdessen machen sollen? Ich bin ganz Ohr!!!Wenn x_ptr ein X_Ptr ist, was ist dann *x_ptr?
Wenn ich mich nicht irre ist der Operator * in X_Ptr überladen und gibt den eigentlichen Zeiger zurück? Lasse mich gerne eines besserem belehren.
Das kann eigentlich gar nicht compilieren.
Mit nur mannis vorschlag, emplace hat das ganz gt geklappt mit dem Kompilieren!?!?
Warum so kompliziert mit so vielen Indirektionen?
Die Indirektionen habe ich so bekommen.
-
lespaul schrieb:
manni66 schrieb:
Warum um alles in der Welt ist die Map Heapallokiert?
Ich übergebe den Zeiger auf das unordered_map später an eine andere Klasse zur Auswertung.
Ja, und?
Ich habe mir mal die unorderd map ausgeben lassen. In einer Schleife schiebe ich als Key long long int Werte rein. Als Value jedesmal andere X_Ptr objekte.
Dabei lasse ich per & die Adresse der X_Ptr ausgeben. Mir fällt auf, dass die X_Ptr in der unordered_map alle die gleoiche Adresse haben?Du hast ganz offensichtlich größere Schwierigkeiten bei der Verwendung von Zeigern (eine dieser Schwierigkeiten ist, dass du Zeiger nutzt
). Wer weiß schon, was du nun wieder genau gemacht hast, wenn du uns den Code nicht zeigst? Wahrscheinlich hast du nämlich irgendwas ganz anderes gemacht, als du denkst.
-
Gibst Du die Adresse des X_Ptr in der Map aus, oder die Adresse des X_Ptr, in den Du den Wert in der Map kopierst?
-
LordJaxom schrieb:
Gibst Du die Adresse des X_Ptr in der Map aus, oder die Adresse des X_Ptr, in den Du den Wert in der Map kopierst?
Die Adresse der X_Ptr.
-
Diese Antwort ist ungefähr so gehaltvoll wie:
"Ist grün die Farbe des Autos oder der Ampel?" - "Die Farbe ist grün"
-
Sorry, nochmal ausführlich:
Ich iteriere mit einem iterator it durch meine unordered_map.
DannX_Ptr temp = it->second; cout << "ID " << it->first << " Adresse: " << &temp;natürlich inkrementiere ich mein ++it am Ende dere Schleife.
-
Genau das meinte ich aber:
Du kopierst den X_Ptr aus der Map nach temp und gibst dann die Adresse von temp aus. Also erhälst Du die Adresse von temp und nicht von dem X_Ptr in der Map.
Und auch wenn temp im Schleifenkörper definiert ist, wird es immer an der gleichen Adresse liegen.