std::map<char[3], unsigned long> --> Angabe einer expliziten Initialisierung für Felder nicht moeglich



  • Hallo, ich möchte folgende Map bauen:

    typedef std::map<char[3], unsigned long> CounterMap;
    

    Als Fehlermeldung bekomme ich dann dieses

    c:\...\utility(21) : error C2536: 'std::pair<char const  [3],unsigned long>::first' : Angabe einer expliziten Initialisierung fuer Felder nicht moeglich
    c:\...\utility(25) : Siehe Deklaration von 'first'
    c:\...\utility(21) : Bei der Kompilierung der Member-Funktion
     '__thiscall std::pair<char const  [3], unsigned long>::std::pair<char const [3],unsigned long>(const char (&)[3],const unsigned long &)'
     der Klassenvorlage
    

    Klar könnte ich das auch mit einem std::string lösen, aber ich brauche nur Platz für genau zwei Buchstaben (+'\0').

    Was fehlt meinem Compiler zu seinem (und meinem) Glück noch?



  • char*



  • char* wollte ich ja gerade vermeinden.
    Dann müsste ich mir ja alle Texte wieder mit new anlegen und mich selbst drum kümmern.



  • es geht nicht.



  • Nun gut, dann mache ich es mit std::string.

    Danke für die schnellen Antworten.



  • typedef std::map<boost::array<char, 3>, unsigned long> CounterMap;
    
    CounterMap map;
    boost::array<char, 3> array = { 'a', 'b', 'c' };
    map.insert(std::make_pair(array, 123));
    


  • Es ginge schon.

    struct mychar{char a,b,c;
    char operator[](unsigned int index)
    {
      if(index < 1) return a;
      if(index >1 && index < 3)return c;
      if(index == 1)return b;
      throw std::exception("OUT OF BOUNDS");
    }
    };
    // oder
    struct mychar{int a;
    char operator[](unsigned int index)
    {
      if(index < 3)
        return ((char*)&a))[index];
      throw std::exception("OUT OF BOUNDS");
    }
    };
    
    std::map<mychar,std::string> mymap;
    

    Ich würde aber Boost::array vorziehen 😉



  • phlox81 schrieb:

    Es ginge schon.

    struct mychar{char a,b,c;
    char operator[](unsigned int index)
    {
      if(index < 1) return a;
      if(index >1 && index < 3)return c;
      if(index == 1)return b;
      throw std::exception("OUT OF BOUNDS");
    }
    };
    // oder
    struct mychar{int a;
    char operator[](unsigned int index)
    {
      if(index < 3)
        return ((char*)&a))[index];
      throw std::exception("OUT OF BOUNDS");
    }
    };
    
    std::map<mychar,std::string> mymap;
    

    🙄 🙄 🙄 🙄 🙄 🙄 🙄 🙄 🙄



  • FireFlow schrieb:

    typedef std::map<boost::array<char, 3>, unsigned long> CounterMap;
    
    CounterMap map;
    boost::array<char, 3> array = { 'a', 'b', 'c' };
    map.insert(std::make_pair(array, 123));
    

    Dazu noch eine kleine Frage:
    Ist es sinnvoller
    map["abc"] = 123;
    oder
    map.insert(std::make_pair("abc", 123));
    zu schreiben.



  • Insert fügt nur ein Element ein wenn es noch keines mit dem Key gibt.



  • Das weiß ich.
    Ist insert besser, wenn ich weiß, dass noch keines mit diesem Key drin ist?



  • Prüfen ob es den Key bereits gibt werden wohl insert und op[]. Insert muss es ja wissen um einzufügen und op[] um zu wissen ob er überschreiben muss oder nen neues Element einfügen muss.
    Ich verwende op[], da er mir syntaktisch besser gefällt.



  • op[] hat den Nachteil das er einen Default-Konstruktor voraussetzt.


Anmelden zum Antworten