Einfügen benutzerdefinierter Objekte in std :: map

  • Ich habe map :: map reference bei Cplusplus.com durchgelesen und bin mir immer noch nicht sicher, wie ich das erreichen kann. Wenn mir jemand einen Rat geben könnte, wäre ich sehr dankbar.

    Ich möchte nur eine Karte wie folgt erstellen:

     std::map<TriSpec, unsigned int> TriSpecMap;
     

    Dann möchte ich folgendes einfügen:

     result = TriSpecMap.insert(std::make_pair(triSpecObject, anUnsignedInt));
     

    Kann mir jemand erklären, ob ich den richtigen Operator überlaste und ob die Funktion / Formatierung, die ich verwende, korrekt ist? Wenn ich result.second anschaue, ist es immer wahr, wenn das Objekt, das eingefügt wird, bereits in der Map vorhanden sein sollte. Im Folgenden finden Sie ein kurzes Beispiel für meinen TriSpec-Header und .cpp

     //TriSpec.h
    #ifndef TRISPEC_H
    #define TRISPEC_H
    class TriSpec
    {
    public:
        TriSpec(void);
        ~TriSpec(void);
    
        unsigned int m_position;
    };
    bool operator< (const TriSpec& lhs, const TriSpec& rhs);
    #endif
    
    
    //TriSpec.cpp
    #include "TriSpec.h"
    
    TriSpec::TriSpec(void){}
    TriSpec::~TriSpec(void){}
    
    bool operator< (const TriSpec& lhs, const TriSpec& rhs)
     {
          if (lhs.m_position < rhs.m_position) return true;
          else return false;
     }
     
    22 November 2011
    Lord_Dizzie
2 answers
  • Ich sehe kein Problem mit Ihrem Code, es sei denn, der bool-Operator sollte eine friend-Methode sein (er kann nicht einmal ohne das Schlüsselwort friend übersetzt werden):

    Dann funktioniert es wie erwartet:

     int main(int argc, _TCHAR* argv[])
    {
        std::map<TriSpec, unsigned int> TriSpecMap;
    
        TriSpec triSpecObject1;
        triSpecObject1.m_position = 1;
    
        TriSpec triSpecObject2;
        triSpecObject2.m_position = 1;
    
        TriSpec triSpecObject3;
        triSpecObject3.m_position = 3;
    
        std::pair<std::map<TriSpec, unsigned int>::iterator, bool> retVal = 
            TriSpecMap.insert(std::make_pair(triSpecObject1, 1));
    
        retVal = TriSpecMap.insert(std::make_pair(triSpecObject2, 1));
    
        retVal = TriSpecMap.insert(std::make_pair(triSpecObject3, 1));
    
        return 0;
    }
     

    Das Ergebnis von der ersten Einfügung ist wahr, das Ergebnis von zweit ist falsch, die dritte ist wieder wahr - wie es sein sollte. Der Map-Container enthält dann zwei Objekte - triSpecObject1 und triSpecObject3.

    22 November 2011
    vitakot
  • Das sieht nicht so aus, als würde es kompilieren - Ihr operator< liefert nicht in allen Fällen einen Wert zurück. (Edit: Du hast das Problem behoben, danke.) Du kannst es ziemlich vereinfachen:

     bool operator< (const TriSpec& lhs, const TriSpec& rhs)
     {
          return (lhs.m_position < rhs.m_position);
     } 
     

    Seit Sie zeigen nicht den vollständigen Code an, der in die Karte eingefügt wird. Es ist unmöglich zu sagen, warum der Rückgabewert .second immer true zurückgibt.

    22 November 2011
    Mark Ransom