Avatar billede bjering Nybegynder
08. september 2004 - 16:14 Der er 7 kommentarer og
1 løsning

omkring std::multimap.

Hejsa igen...

nu har jeg så lært omkring maps, og ville så gerne lege lidt med multimaps.

det jeg skal bruge den til er at lave en map over known objects for en bruger.

det foregår på den her måde:

// holds users known objects
struct knownobjects
{
    unsigned int socketid;
    unsigned long objectid;
};

hvor key : socketid
sockedid : socketid
objectid : known object id.

det jeg skal finde ud af er:

at tjekke alle object id's der tilhører key for brugeren, og derefter tjekke knownobject id med den object id der nu er på skærmen (for at tjekke om han allerede har den object, eller om den skal smides ind som en ny known object).

dvs key er altid den samme
det eneste der ændrer sig er min object id for key, så jeg skal vel bruge en multimap...

så er der nogen der har nogle eksempler på multimaps som indeholder:

lave en.
tilføje til en

tjekke om en key == min key && objectid == min nye object id.

hente data ud baseret på socketid + object id.

eg:

    multimap<int,struct knownobjects>::iterator it;
    for(it = ko.begin() ; it != ko.end() ; it++ )
    {
        unsigned int id = ko[it->first].socketid;
        unsigned long thisobjid = ko[id].objectid;

sådan, normal hverdags brug at std::multimap..

btw har haft kigget på http://www.cppreference.com/cppmultimap.html men der var ikke rigtig nogen eksempler på noget af det jeg skal bruge..
Avatar billede bjering Nybegynder
08. september 2004 - 16:23 #1
f.eks den her:

void removeknownobject(unsigned int cp, unsigned long objid)
{
    multimap<int,struct knownobjects>::iterator it;
    for(it = ko.begin() ; it != ko.end() ; it++ )
    {
        unsigned int id = ko[it->first].socketid;
        unsigned long thisobjid = ko[id].objectid;
        if (cp == id && objid == thisobjid)
        {
            ko.erase( id );
        }
    }
};

giver mig en fejl her:

error C2676: binary '[' : 'class std::multimap<int,struct knownobjects,struct std::less<int>,class std::allocator<struct knownobjects> >' does not define this operator or a conversion to a type acceptable to the predefined operator
Avatar billede bjering Nybegynder
08. september 2004 - 16:24 #2
doh! min multimap declaration

// holds users known objects
struct knownobjects
{
    unsigned int socketid;
    unsigned long objectid;
};

multimap<int,struct knownobjects> ko;

og SÅ

void removeknownobject(unsigned int cp, unsigned long objid)
{
    multimap<int,struct knownobjects>::iterator it;
    for(it = ko.begin() ; it != ko.end() ; it++ )
    {
        unsigned int id = ko[it->first].socketid;
        unsigned long thisobjid = ko[id].objectid;
        if (cp == id && objid == thisobjid)
        {
            ko.erase( id );
        }
    }
};
Avatar billede bjering Nybegynder
08. september 2004 - 16:25 #3
den virker jo med en normal std::map , men ikke med en std::multimap.
Avatar billede bjering Nybegynder
08. september 2004 - 20:19 #4
har opped til 200 points, tror det er svært siden ingen ved det :P
Avatar billede bjering Nybegynder
08. september 2004 - 20:27 #5
fandt en ting der ikke giver en fejl... men..

void checkknownobject(DWORD ptr, unsigned long objid, char * charname)
{
    CConnection* c = reinterpret_cast <CConnection*> (ptr);
    char            cip[15];
    unsigned int    cp = 0;
    c->PeerInfo (&cip[0], 15, &cp);

    for (multimap<int, struct knownobjects>::iterator it = ko.begin(); it != ko.end(); ++it)
    {
        unsigned int id = (*it).first;
        unsigned long thisobjid = (*it).second.objectid;
   
        if (cp == id && objid == thisobjid)
        {
            Log2File(TRUE, "Object already known\n");
            // object is already known
            sendusermovepack(charname, objid, ptr);
        }
        else
        {
            Log2File(TRUE, "Add known object\n");
            // object is not known, we add it.
            addknownobject(cp, objid);
            // then we send him the object information
            senduserobjnewpack(charname, ptr);
        }
    }
    return;
}

den virker ikke, hvis jeg smider f.eks senduserobjnewpack(charname, ptr);

over for (multimap<int, struct knownobjects>::iterator it = ko.begin(); it != ko.end(); ++it) så ruller den, men hvis den er under så sker der intet, om den finder en object der matcher eller ikke...

så jeg må jo tro der er en fejl et eller andet sted der..
Avatar billede bertelbrander Novice
08. september 2004 - 21:33 #6
En multimap kan til forskel fra en map have flere entries med samme nøgle, og så giver det ikke så meget mening at bruge [], for man ved jo ikke hvilken af entrierne man får.

Normalt bruger man lower_bound til at få en iterator til den første entry der matcher.
Avatar billede bjering Nybegynder
08. september 2004 - 21:36 #7
har fundet mit problem, min multimap var empty så den skipper min for loop.

lavede sådan hvis multimap er empty så ligger den første map entry ind.
Avatar billede bjering Nybegynder
08. september 2004 - 21:37 #8
svar.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis