Zuordnung von Koordinaten -> String
-
Hi,
ich möchte mit einem Satz Koordinaten einen String finden
typedef struct { UINT8 x; UINT8 y; } CCoord_t; std::map<CCoord_t,String> m_Map; std::vector<std::vector<String>> m_Vector;In der Richtung hatte ich mir das vorgestellt, aber eine std::map scheint nicht auf einem struct als Key zu funktionieren. Kann das sein? Bekomme eine dieser Template Compilerfehlermeldungen, die ich nicht lesen kann

Wäre es dann am sinnvollsten über den Vector zu indexieren?
String& s = m_Vector[x][y];Oder was würde am meisten Sinn machen?
danke
-
Du brauchst einfach nur eine Ordnungsrelation für dein CCoord_t:
// entweder bool operator<( CCoord_t const& lhs, CCoord_t const& rhs ) { return lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y < rhs.y); } // oder struct CmpCCoord_t { bool operator()( CCoord_t const& lhs, CCoord_t const& rhs ) const { return lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y < rhs.y); } }; std::map<CCoord_t, String, CmpCCoord_t> m_Map;edit:
Falls deine Matrix vollbesetzt (ggf. sogar nur nahezu) ist macht der vector natürlich mehr Sinn.
-
Danke, auch wenn ich nicht ganz verstehe wieso, weshalb, warum.

die Matrix ist ca. 20% gefüllt - es geht mehr um die Zuordnung, als den Raum zu füllen
-
//machs so string Arr[10][20]; // oder so typedef string(*strPtr)[20]; strPtr PArr = new string [10][20]; //z.B. PArr[5][6] = "String65"; string s = PArr[5][6];
-
Danke, Array (und auch Vector) wollte ich eigentlich nicht benutzen, weil man für den ganzen Bereich dann eben Speicher braucht auch wenn er nur wenig gefüllt wird.
@finix
Wieso funktioniert ...void setPosition( const String& name, const CCoord_t& position ) { //dieses hier: m_Map__[position] = name; //...aber dieses nicht: m_Map__.insert( position, name ); }Ich dachte es wäre das Gleiche
danke
-
Weil dein insert falsch ist. Es müsste so aussehen (z.Bsp.)
m_Map__.insert( make_pair(position, name) );
-
Davon ab ist es auch semantisch nicht das Gleiche: op[] überschreibt den alten Wert, insert nicht.
Und doppelte Underscores sind als Bezeichner gar nicht gern gesehen
-
Danke!

-
_et schrieb:
Hi,
... std::vector<std::vector<String>> m_Vector;...
Nur noch eine ganz kleiner Bemerkung am Rande:
">>" darf man in templates nicht schreiben, weil das als eigenes Token gelesen wird ! (hast Du vielleicht auch nicht, aber hier sieht's eben so aus)
Sowas schmeißt auch garstige Fehlermeldungen.Da muss ein Leerzeichen zwischen:
std::vector<std::vector<String> > m_Vector;Mit den anderen Definitionen hast Du das Problem erstmal umgangen, aber es könnte Dich doch hier und da noch erwischen.
Gruß,
Simon2.