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.


Anmelden zum Antworten