Avatar billede krukken Juniormester
04. oktober 2005 - 11:57 Der er 18 kommentarer og
1 løsning

Der bliver aldrig indsat mere end en entry

Hej,

Jeg har en map hvor jeg forsøger at indsætte nogle data i.

Min map indeholder følgende data:
map<char *,Item *> mymap;

Og jeg indsætter dem ved:
Item *i = new Item("navn","data");
mymap.insert(std::make_pair(i->getName(),i));

Problemet ligger nu at jeg aldrig for indsat mere end en entry i mappen. (Du skal ikke bekymre dig om eventuelle små programmeringsfejl i ovenstående kode - det er et pricippet i det!)
Avatar billede krukken Juniormester
04. oktober 2005 - 11:57 #1
Item modtager Item::Item(char *, char *) - sådan ser konstruktoren ud for item.
Avatar billede lars314 Nybegynder
04. oktober 2005 - 12:10 #2
En map kan kun indeholde et element med samme nøgle (her char*).
Så vidt jeg kan se giver du dem alle samme nøgle, nemlig "navn".
Avatar billede krukken Juniormester
04. oktober 2005 - 12:15 #3
Det ved jeg faktis godt - og egentlig er det også sådan at dette navn ændre sig i koden. Men jeg tror måske alligevel du har fak i noget af det rigtig. Jeg giver en pointer med - hvis denne pointer ikke ændrer sig, så opstår samme problem vel?
Avatar billede lars314 Nybegynder
04. oktober 2005 - 12:18 #4
Ah jo, for nøgle er pointeren!

Bruge evt en string istedet.

map<string, item*> mymap;
Avatar billede krukken Juniormester
04. oktober 2005 - 12:18 #5
Hvis vi nu siger at jeg modtager de to paramtre fra cin, hvordan giver man dem så med som parametre til Item-construktoren, sådan er det bliver kopieret derover i, også addressen ikke er den samme?
Avatar billede krukken Juniormester
04. oktober 2005 - 12:19 #6
Er det ikke muligt at bruge en char *?
Avatar billede lars314 Nybegynder
04. oktober 2005 - 12:23 #7
Hvad med

map<string, string> mymap;

mymap.insert("navn1", "test1");
mymap.insert("navn2", "test2");

cout << mymap["navn1"] << endl; // giver vel "test!"
Avatar billede krukken Juniormester
04. oktober 2005 - 12:25 #8
Hvordan kan det gøres med char *?
Avatar billede lars314 Nybegynder
04. oktober 2005 - 12:26 #9
Eller

map<string, string> mymap;

mymap["navn1"] = "test1";
mymap["navn2"] = "test2";

cout << mymap["navn1"] << endl; // giver vel "test1"
Avatar billede lars314 Nybegynder
04. oktober 2005 - 12:27 #10
Som nøgle, kun hvis du laver en ny char* for hvert entry. Men hvorfor bruge char* (de er ligesom arrays "onde")
Avatar billede krukken Juniormester
04. oktober 2005 - 12:27 #11
Hvordan kan det gøres med char *?:-)
Avatar billede lars314 Nybegynder
04. oktober 2005 - 12:31 #12
Det kan vist kun gøres på en meget besværlig og usikker måde. Du risikere en masse memory leaks og andre problemmer.
Den kan jeg ikke lige klarer.

Hvorfor insisterer du på at bruge char*?
Avatar billede bertelbrander Novice
04. oktober 2005 - 19:41 #13
Man kan godt bruge en char *, der er et eksempel her:
http://www.sgi.com/tech/stl/Map.html

Tricket er at lave en comperator.

Men der er mange gode grunde til at lade være.
For at det skal kunne virke skal du sikre dig at pointeren peger på det samme i al den tid et elementet eksisterer i map'en. Hvis der kun bliver indsat ét element i din map'e nu, er der ingen grund til at tro at det vil virke blot ved at tilføje en comperator.
Avatar billede krukken Juniormester
04. oktober 2005 - 19:45 #14
bertelbrander > jamen jeg har sådan set fået det til at virke med "char *" - problemet er bare at addresse på "char *" ikke ændre sig når jeg giver den med til objektet. Så næste gang jeg opretter en objekt er adressen den samme, og derfor bliver der ikke lagt flere entries ind i min map.

Det der eksempel har jeg nemlig også fundet:-)
Avatar billede bertelbrander Novice
04. oktober 2005 - 19:48 #15
Hvis du har:

std::map<char *, int>Map;
char Temp[32];
strcpy(Temp, "Test1");
Map.insert(std::make_pair(Temp, 1));
strcpy(Temp, "Test2");
Map.insert(std::make_pair(Temp, 2));

Vil det ikke virke, uanset hvordan du laver comperatoren.

Den lette og sikre løsning er at bruge en std::string.
Avatar billede bertelbrander Novice
04. oktober 2005 - 19:52 #16
Hvis du vil bruge en char * bør du new'e (eller malloc) plads til strengen når du putter i map'en, og så delete (eller free) den når du sletter elementet i map'en.
Avatar billede krukken Juniormester
10. november 2005 - 23:21 #17
bertelbrander > ligger du er svar?
Avatar billede bertelbrander Novice
10. november 2005 - 23:24 #18
Nej, jeg samler ikke på point.
Avatar billede krukken Juniormester
10. november 2005 - 23:40 #19
okay
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester