Avatar billede bjering Nybegynder
10. september 2004 - 13:38 Der er 13 kommentarer og
1 løsning

en spørgsmål omkring multimap, og at slette noget af indholdet

kan man egentlig tillade sig at gøre følgende..

lad os sige min memory map indeholder det her

int  :  long

2818 : D8D1A101
2818 : D8D1A103
2818 : D8D1A107
2818 : D8D1A110
3308 : A1D9D19D
3308 : A1D9D19A
3308 : A1D9D19B
3308 : A1D9D19C
1818 : 18D9C991
1818 : 18D9C992
1818 : 18D9C993
1818 : 18D9C994

kan man tillade sig at slette alle der tilhører 3308 uden at det messer up min multimap ?

tænker på at køre en loop ala

find alle 3308, så noget ala :

mm.erase(3308);

vil det ikke gøre sådan at de andre ikke længere passer i value ?

---

og sidste spørgsmål..

lad os sige jeg har en SUPER stor strukt til eg en char

struct characters
{
  unsigned int socket;
  string charname;

}
Avatar billede bjering Nybegynder
10. september 2004 - 13:43 #1
..... kom til at trykke for hurtigt... igen...

struct characters
{
  unsigned int socket;
  string charname;
  int16 locx;
  int16 locy;
  int16 hp;
  int16 maxhp;
  int16 mp;
  int16 maxmp;

osvosv
};

hvad ville være den absolute bedste måde at opdatere en sådan map på (denne er ikke multimap).

måske noget ala

int16 _Hp;

int16 getHp()
{
  return _Hp;
}

int16 setHp(int16 hp)
{
  int16 _Hp = hp;
}

osvosv (well sådan noget ligende det)

det samme med opdatering af indhold osv osv..

er der nogen steder hvor noget er beskrevet ligesom det ?
Avatar billede bjering Nybegynder
10. september 2004 - 14:04 #2
nu er det her bare hurtig skrevet og virker sikkert ikke, bare et eksempel...

struct characters
{
  unsigned int socket;
  string charname;
  int16 locx;
  int16 locy;
  int16 hp;
  int16 maxhp;
  int16 mp;
  int16 maxmp;
};

class charmap
{
private:
    map<int,struct characters> chmap;
    struct characters ch;
    static int mapkey = 0;
public:
    void setMapkey(int mapkeyid)
    {
        mapkey = mapkeyid
    }
    void setSocket(unsigned int socket)
    {
        ch.socket = socket;
        pair<int ,struct characters> p(mapkey,ch);
        chmap.insert(p);
    }
    unsigned int getSocket()
    {
        socket = chmap[mapkey].socket;
        return socket;
    }
};

det er sådan noget LIGENDE jeg leder efter at lave.. kan det lade sig gøre ?
Avatar billede bjering Nybegynder
10. september 2004 - 14:07 #3
så kunne man f.eks (hvis dette virkede) skrive

charmap chm;

chm.setMapkey(3301); // set din map key først hver gang man bruger den.

chm.setSocket(1000); // så sætter vi socket til 1000 ved key 3301

unsigned int socket = getSocket(); // ingen grund til at skrive key igen, den har vi inde, hent socketid fra map 3301

eksempel bare..
Avatar billede bjering Nybegynder
10. september 2004 - 22:19 #4
okay prøvede lige at lave en ala getter / setter std::map fil, den virker også for første entry til mappen, så stopper den

source.
http://www.freeplay.dk/charmap.h

brugte det her til at teste den med:

  chm.setMapkey(2000);
  chm.setCha(20);
  chm.setCon(10);

  int8 chame = chm.getCha();
  int8 conme = chm.getCon();

  Log2File(TRUE, "Cha : %i, Con %i\n", chame, conme);

her er min output fra loggen

[22:15:39] Cha : 20, Con 0

hvad er fejlen ? glemmer den key'n ? tillader den ikke jeg adder nyt til den gamle ? eller hvad ?
Avatar billede bertelbrander Novice
11. september 2004 - 01:09 #5
Svar på det første spørgsmål:

#include <iostream>
#include <map>
#include <algorithm>

std::multimap<int, int>MyMap;

int main()
{
  MyMap.insert(std::make_pair(1, 2));
  MyMap.insert(std::make_pair(2, 3));
  MyMap.insert(std::make_pair(2, 4));
  MyMap.insert(std::make_pair(3, 5));

  std::multimap<int, int>::iterator it;

  std::cout << "Before" << std::endl;
  for(it = MyMap.begin(); it != MyMap.end(); ++it)
      std::cout << it->first << ", " << it->second << std::endl;

  std::multimap<int, int>::iterator Start, Stop;
  std::cout << "After" << std::endl;

  Start = MyMap.lower_bound(2);

  if(Start != MyMap.end())
  {
      Stop = MyMap.upper_bound(2);
      MyMap.erase(Start, Stop);
      for(it = MyMap.begin(); it != MyMap.end(); ++it)
        std::cout << it->first << ", " << it->second << std::endl;
  }
}
Avatar billede bertelbrander Novice
11. september 2004 - 01:56 #6
Ved næremere eftertanke, der findes jo en erase(key) så man laver blot:

#include <iostream>
#include <map>
#include <algorithm>

std::multimap<int, int>MyMap;

int main()
{
  MyMap.insert(std::make_pair(1, 2));
  MyMap.insert(std::make_pair(2, 3));
  MyMap.insert(std::make_pair(2, 4));
  MyMap.insert(std::make_pair(3, 5));

  std::multimap<int, int>::iterator it;

  std::cout << "Before" << std::endl;
  for(it = MyMap.begin(); it != MyMap.end(); ++it)
      std::cout << it->first << ", " << it->second << std::endl;

  std::multimap<int, int>::iterator Start, Stop;
  std::cout << "After" << std::endl;
  MyMap.erase(2);
  for(it = MyMap.begin(); it != MyMap.end(); ++it)
      std::cout << it->first << ", " << it->second << std::endl;
}
Avatar billede bertelbrander Novice
11. september 2004 - 02:18 #7
Jeg har lidt svært ved at regne ud hvad du vil opnå med det andet spørgsmål.

Du har en charmap class der indeholder en std::map og én struct af typen characters.
Det betyder at alle der bruger den samme instans af charmap'en vil bruge den samme instans af charmap'en, hvad er så pointen i std::map'en ?

I alle dine set funktioner modificerer du den samme struct, og forsøger at indsætte denne i std::map'en med samme key, det går ikke, en std::map må kun have et entry med samme key.

Jeg kunne forestille mig at du lavede dine set funktioner om så de kom til at se ca sådan ud:

void setXX(int xx)
{
  map<int,struct characters>::iterator it = chmap.find(mapkey);

  if(it != chmap.end())
      it->second.XX = xx;
  else
  {
      struct characters cc;
      cc.XX = xx;
      chmap.insert(make_pair(mapkey, cc));
  }
}
Avatar billede bjering Nybegynder
11. september 2004 - 02:19 #8
ah okay, erase sletter alle keys med den id der er i den, behøver altså ikke at køre en iterator for det..

hvad så med andet spørgsmål, sad og tænkte måske man skulle gøre dette ved første brug at mappen (per key) noget ligende det her

void CreateMap(int key)
{
int empty = 0;
ch.socket = key; // bruger socketid som key alligevel kan ligesågodt smide den ind.
ch.charname = empty;
ch.locx = empty;
ch.locy = empty;
ch.hp = empty;
//osvosv, indtil vi har været hele mappen igennem

pair<int ,struct characters> p(key,ch);
chmap.insert(p);
}

den må så oprette en map hvor alle id'er er fyldt ud ?

hvorefter man kan opdatere de values med setter'ne ?

hmmmmm
Avatar billede bjering Nybegynder
11. september 2004 - 02:22 #9
det andet spørsmål ... hmm lad mig se om jeg kan forklare bedre..

f.eks, hvis jeg vil have hp'en på char som er gemt med key 10, ville jeg gøre sådan her:

chm.setMapkey(thischarskey);
int16 myhp = chm.Gethp();

så har jeg f.eks min hp, hvis jeg så får et slag, kan jeg opdatere min hp med

chm.setMapkey(thischarskey);
chm.setHp(newhp);

bare som eksempel, jeg vil have fuld kontrol over min map...
Avatar billede bjering Nybegynder
11. september 2004 - 02:24 #10
dvs jeg vil skulle kunne opdatere, hente, osv ting fra min map uden at skulle til at slette den først for at den ikke kager, og uden jeg skal lave en 10 kilometer source bare for at opdatere f.eks min hp ved key x.
Avatar billede bertelbrander Novice
11. september 2004 - 02:30 #11
Ok, men du bliver nødt til at oprette en ny instans af characters struct'en for hver key, hvilket man fint kunne gøre i CreateMap.

En std::map "kager" ikke fordi man roder med data, kun hvis man forsøger at rode med key'en (hvilket man ikke får lov til). Så man kan altid tage en iterators second og modificere denne.

Jeg synes at det er pænere at angive key'en ved hver kald til get og set functioner end at map'en gemmer den nuværende key. Men det er selvfølgelig et spørgsmål om smag og behag.
Avatar billede bjering Nybegynder
11. september 2004 - 03:11 #12
jeg bruger lige nu den der du lavede

void setXX(int xx)
{
  map<int,struct characters>::iterator it = chmap.find(mapkey);

  if(it != chmap.end())
      it->second.XX = xx;
  else
  {
      struct characters cc;
      cc.XX = xx;
      chmap.insert(make_pair(mapkey, cc));
  }
}

ser ud som om den virker bare..

nu har jeg rigeligt at rode med de næste mange dage, så hvis du smider et svar vipper jeg lige points'ne til dig og så går igang med at lave det..

eller var det dig der ikke ville have points ? (kan aldrig huske hvem det var), men hvis det ikke er dig, så smid et svar :)
Avatar billede bertelbrander Novice
11. september 2004 - 12:48 #13
Jeg er en af dem der ikke vil have point.
Avatar billede bjering Nybegynder
11. september 2004 - 17:56 #14
okay, men takker alligevel, og så lukker jeg den lige.
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