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 KlassenvorlageKlar 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.