Avatar billede vandborg Nybegynder
21. marts 2007 - 12:34 Der er 7 kommentarer og
1 løsning

Hvordan looper jeg bedst igennem min vector<bool>?

Hej eksperter!

Er for tiden i gang med at lave et SDL projekt, hvor jeg har brug for at holde styr på hvilke pixels er solid i forbindelse med noget collision detection. Dette gør jeg vha. en vector<bool> (en bitvector), men jeg er i tvivl om, hvordan jeg bedst kan loope igennem denne vector.

Som det ser ud nu gør jeg det på følgende måde:

vector<bool> pixelState;
pixelState.resize(screen->pitch * screen->h);
   
pixelState[20000] = true;
pixelState[200000] = true;
pixelState[300000] = true;
int z = 0;
for (vector<bool>::const_iterator i = pixelState.begin(); i < pixelState.end(); ++i) {
    if (*i)
        cout << "Found at: " << z  << endl;
    ++z;
}

Og så vidt jeg kan se er det ikke en optimal løsning, da z hele tiden bliver incremented. Er der en måde at finde et index på en hurtigere måde? Føler min nuværende metode er en beskidt nødløsning.
Avatar billede mxs Nybegynder
21. marts 2007 - 13:45 #1
Jeg kan ikke se noget forkert i det du gør da det er en meget fin C++ løsning du bruger.
Avatar billede vandborg Nybegynder
21. marts 2007 - 16:14 #2
Det var da rart at vide :)

Det kan være svært nogen gange at vide, om den metode man bruger er den "optimale".

Jeg lader lige spørgsmålet stå åbent en dag eller to, hvis der ikke kommer indvendinger lukker jeg det :)

Men tak, mxs :)
Avatar billede arne_v Ekspert
21. marts 2007 - 16:59 #3
du kan ogsaa

for(int i = 0; i < pixelState.size(); i++)
{
  if (pixelState[i])
        cout << "Found at: " << i  << endl;
}

men om du synes det er paenere maa vaere smag og behag
Avatar billede vandborg Nybegynder
21. marts 2007 - 17:08 #4
Hrmm, det kunne godt tænkes det var lidt renere at se på. Men æstetikken er mig ligegyldig. Er bare interesseret i den hurtigste metode :)
Avatar billede mxs Nybegynder
21. marts 2007 - 18:47 #5
arne_v's eksempel er mere enkel. Bruger dog selv iteratorer når jeg laver forløkker.
Avatar billede bertelbrander Praktikant
21. marts 2007 - 19:44 #6
Hvis det skal være meget hurtigt, og der kun er få bits der kan være sat, kan du med fordel bruge et gammeldags array:

#define NUM_BITS 1024
unsigned int pixelState[NUM_BITS];

Set bit 20000:
pixelState[20000/32] |= 1 << (20000%32);

Så kan du søge med:
for(int i = 0; i < NUM_BITS/32; i++)
  if(pixelState[i])
      for(int j = 0; j < 32; j++)
        if(pixelState[i] & (1 << j))
          z++;
Avatar billede vandborg Nybegynder
22. marts 2007 - 01:27 #7
Mange tak, tror jeg vil prøve den tilgang. :)

Skriv et svar for point.
Avatar billede vandborg Nybegynder
27. marts 2007 - 19:51 #8
Lukker spørgsmålet, hvis du vil have point på et andet tidspunkt må du endeligt sige til, bertelbrander.
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