ueberpruefen ob std::map initialisiert hat
-
hallo,
ich habe ein duennbesetztes 2D Zahlenfeld. Zu mehreren besetzten Koordinaten (etwa Koordinate (1,41) wird ein Wert gespeichert (etwa Wert 0 oder 431) ).
Ich moechte aber um Speicher zu sparen einige Felder nicht initialisieren muessen.
Wie ueberpruefe ich nun, ob in meinem Zahlenfeld bei einer bestimmten Koordinate bereits ein Wert gesetzt wurde?#include <map> template < typename T > class SparseMatrix { std::map< std::pair< long, long >, T > rep; public: void SetValue(long x, long y, T set_value) { rep[ std::make_pair( x, y ) ] = set_value; } T GetValue( long x, long y ) { return rep[ std::make_pair( x, y ) ]; } bool IsVoid( long x, long y ) const {} }Als Templateparameter habe ich double gewaehlt. Das Problem ist auch, dass ich etwa bei GetValue fuer nicht initialisierte Zahlenfelder den Wert 0 erhalte. Dies ist etwas anderes als ein initialisiertes Zahlenfeld mit Wert 0.
Wie muss ich isVoid programmieren?
-
Hi,
das Problem ist das wenn du bei einer map auf einen Key-Eintrag zu greifst, welcher nicht existiert, wird dort das Value-Objekt konstruiert.std::map<int, string > mappi; cout << mappi[0]; // Sobald du auf ein Value zugreifen willst, das nicht existiert, wird eins angelegt, dh in mappi[0] steht nun ein leerer stringUm das Problem zu umgehen, prüfe in getValue mit find, ob dieser Key schon eingetragen ist, wenn ja gib das Objekt zurück und wenn nicht nen FehlerCode oder ne Exception.
-
Es wäre auch vom Vorteil sein einen vector< vector<T> > zu benutzen. Dabei hast du auch deine 2D Matrix mit deinem T-Value.
-
Mir ist nicht klar wie ich überprüfe ob in GetValue der Eintrag existiert.
Also find sieht so aus:
template<class InputIterator, class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last,
const EqualityComparable& value);und ich gebe dann für die Koordinate coord bei der ich den Test mache etwas ein wie:
find( coord, coord, !typeid( void ))
Jedoch gibt mir dann find doch zurück:
Falls noch nicht initialisiert: last, also coord.
Falls ich es initialisiert habe: coord
und ich habe keine Unterscheidung ob ich bereits initialisiert habe, oder?
-
Einfach einen Iterator zurück geben, und find benutzen.
map_type::iterator GetValue( long x, long y ) { return rep.find(std::make_pair( x, y ));
-
danke, hat weitergeholfen

Irgendwie meckert der bei sowas immer noch:
sparse.cpp:17: error: expected ';' before 'GetValue'
Aber das find ich dann am Montag.using namespace std; #include <iostream> #include <map> template < typename T > class SparseMatrix{ std::map< std::pair< long, long >, T > rep; public: void SetValue(long x, long y, T set_value) { rep[ std::make_pair( x, y ) ] = set_value; }; std::map<std::pair< long, long >, T >::iterator GetValue( long x, long y ) { return rep.find(std::make_pair( x, y )); }; };Edit: Codetags hinzugefügt
-
Benutz doch bitte cpp-Tags.
Da fehlt ein typename. Mach Dir aber doch mal ein paar typedefs

typename std::map<std::pair< long, long >, T >::iterator GetValue( long x, long y )