Forum: List med en strukt som datatyp

Forum huvudsida -> Programmering -> List med en strukt som datatyp

Sidor: 1

Till botten

seal 22:55 - 6:e December 2007 | Post #1
Medlem
Inlägg: 32


Skicka PM
Hejsan, håller på att läsa på lite om lister.
Detta verkar vara bättre än arrays i mitt fall då jag behöver lägga till poster under kodens gång.

Jag har en strukt:
  1. struct kordinater
  2. {
  3. int x;
  4. int y;
  5. };


Jag vill skapa en list med denna datatyp
  1. list <kordinater> lista;


Men hur fungerar detta? Om det fungerar alls? Jag fick inga felmeddelanden när jag lade till en struct som datatyp så jag antar att det är möjligt.

Hittade inget om just detta.

Tack åter igen på förhand :-) .




Independence 23:37 - 6:e December 2007 | Post #2
Administratör
Inlägg: 1800


Skicka PM
Vad är det du frågar egentligen?
Du testade, och det funkade?

-------------------------

Vi är riddarna som säger fiskbulle!





tobbez 00:41 - 7:e December 2007 | Post #3
Medlem
Inlägg: 364


Skicka PM
Det fungerar utmärkt. Hur det fungerar? Ett exempel:
  1. #include <list>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. // Enkel datastruktur med konstruktor
  6. struct MyType
  7. {
  8. MyType(int x, int y)
  9. {
  10. this->x = x;
  11. this->y = y;
  12. }
  13. int x;
  14. int y;
  15. };
  16.  
  17. int main()
  18. {
  19. // Skapa en lista
  20. list<MyType> MyList;
  21.  
  22. // Fyll listan med element
  23. for(int i = 0, j = 10; i <= 10; i++, j--)
  24. {
  25. MyType T(i,j);
  26. MyList.push_back(T);
  27. }
  28.  
  29. // Skapa en iterator for att ga igenom alla element i listan
  30. list<MyType>::const_iterator it;
  31. for(it = MyList.begin(); it != MyList.end(); it++)
  32. {
  33. // Skriv ut x och y for varje element
  34. cout << "x: " << (*it).x << "; y: " << (*it).y << endl;
  35. }
  36. return 0;
  37. }

Lite extra kommentarer om sådant som kan vara oklart:
  • Användandet av en const_iterator istället för iterator medför att man inte kan ändra på objekten som iteratorn pekar på. Vill man ändra på objekten får man istället använda en iterator.
  • En * före iteratorn innebär att man hämtar objektet den pekar på.
  • Paranteserna runt *it behövs då . har högre prioritet än *.

Man kan även gå igenom listor som om de vore arrayer, även om det är föredraget att använda iteratorer:
  1. for (int i = 0; i < MyList.size(); i++) cout << MyList[i].x;


Och i allmänna fallet är det bra att hjälp av referenssidor (som till exempel http://cppreference.com/cpplist/index.html ) när man vill veta hur något fungerar.Smiley

Edit: Språkfixar.


Senast redigerad 12:53 - 7:e December 2007


seal 11:22 - 7:e December 2007 | Post #4
Medlem
Inlägg: 32


Skicka PM
Tusen tack tobbez, tillbaka till kodandet :-) .




NetNinja 21:24 - 7:e December 2007 | Post #5
Medlem
Inlägg: 116


Skicka PM
Wow, jag viste inte man kunde använda konstruerare till structs, coolio.

-------------------------





seal 11:47 - 8:e December 2007 | Post #6
Medlem
Inlägg: 32


Skicka PM
Hej igen, testar lite med lister nu och har stött på ett problem.

Jag har en lista med datatyp:
minklass *

En pekare till denna klass alltså.

När jag lägger till ett listitem så använder jag push_back(new minklass(argument))

so far so good, men när jag använder new så måste jag ta bort dessa, med delete då.

Så jag testade detta:

  1. list <minklass *>::const_iterator it;
  2. for(it = listWorm.begin(); it != listWorm.end(); it++)
  3. {
  4. delete *it;
  5. }


,,r det inte så det fungerar? Jag får programfel och att jag måste avsluta programmet, jag antar att jag försöker ta bort ett objekt som inte finns eller liknande?




Independence 12:25 - 8:e December 2007 | Post #7
Administratör
Inlägg: 1800


Skicka PM
En gissning är att du ska ta bort det första elementet hela tiden, eftersom listan krymper när du tar bort ett element. Så halvvägs igenom börjar den försöka ta bort element som inte finns eller så.
Dock så borde det väl finnas något sätt att ta bort hela listan med en gång?

-------------------------

Vi är riddarna som säger fiskbulle!





seal 12:42 - 8:e December 2007 | Post #8
Medlem
Inlägg: 32


Skicka PM
    Citat av Independence:
En gissning är att du ska ta bort det första elementet hela tiden, eftersom listan krymper när du tar bort ett element. Så halvvägs igenom börjar den försöka ta bort element som inte finns eller så.
Dock så borde det väl finnas något sätt att ta bort hela listan med en gång?


Kan jag vända loopen och ta bort dem bakifrån?

Eller något annat förslag hur jag skall gå tillväga? hur jag tar bort hela listen, jag trodde att iom att för varje listitem gör jag en new så behöver jag ta bort varje listitem för sig.




Independence 13:11 - 8:e December 2007 | Post #9
Administratör
Inlägg: 1800


Skicka PM
Hm, det kanske var jag som tänkte på fel sak ändå.
Du tar bara bort det du new:at, inte själva elementet i listan?

-------------------------

Vi är riddarna som säger fiskbulle!





Slash 15:18 - 8:e December 2007 | Post #10
Medlem
Inlägg: 141


Skicka PM
    Citat av seal:

  1. list <minklass *>::const_iterator it;
  2. for(it = listWorm.begin(); it != listWorm.end(); it++)
  3. {
  4. delete *it;
  5. }


,,r det inte så det fungerar? Jag får programfel och att jag måste avsluta programmet, jag antar att jag försöker ta bort ett objekt som inte finns eller liknande?


Det där borde ju fungera, kan det vara något med destrureraren?

-------------------------
Ingen sigantur!



seal 17:00 - 8:e December 2007 | Post #11
Medlem
Inlägg: 32


Skicka PM
Jag löste det, det var så att jag även i detta lade till en referans till ett objekt utan att använda new, och denna blev det alltså 2 delete på som den inte gillade.

Tack i alla fall :-) .






seal 15:20 - 9:e December 2007 | Post #12
Medlem
Inlägg: 32


Skicka PM
Hej igen, nu har jag ett nytt problem. Denna gång inte med en list utan en array.

Såhär ligger det till, jag har en array på 16 i storlek,
( SDL_Surface *arrName[16]), detta är en pekare till SDL_Surface som ni ser. I denna array lägger jag till en pekare till ett nytt surface objekt (om jag gjort det rätt):

  1. arrPics[1] = new SDL_Surface = IMG_Load("sökväg...");


So far so good..

Problemet är åter igen när jag ska köra delete på de poster i arrayen som är fyllda, i konstruktorn så sätter jag värde på alla poster (värde - 0).

Såhär ser loopen ut som ska deleta:

  1. for(int i = 0; i < 16; i++)
  2. {
  3. if( arrPics[i] != 0 )
  4. {
  5. delete arrPics[i];
  6. }
  7. }


Får programfel :-) .

Tacksam åter igen för svar!




Nissebosselasse 17:11 - 9:e December 2007 | Post #13
Medlem
Inlägg: 490


Skicka PM
Använd en vanlig std::vector istället, det är samma tillvägagångssätt som en std::list som du precis använt.

-------------------------
http://pushingcows.se
Gula Nallen



seal 17:17 - 9:e December 2007 | Post #14
Medlem
Inlägg: 32


Skicka PM
    Citat av Nissebosselasse:
Använd en vanlig std::vector istället, det är samma tillvägagångssätt som en std::list som du precis använt.


Jasså, varför ska jag använda en sådan? Vad är skillnaden mellan en vector och en array (förutom att man med en vector inte behöver sätta in storleken när man definerar).

Sedan löste jag problemet, kom på att jag inte ska köra delete på denna utan SDL_FreeSurface.






tobbez 01:36 - 11:a December 2007 | Post #15
Medlem
Inlägg: 364


Skicka PM
Vill bara påminna om att efter den här koden:

  1. list <minklass *>::const_iterator it;
  2. for(it = listWorm.begin(); it != listWorm.end(); it++)
  3. {
  4. delete *it;
  5. }



är det god sed att köra listWorm.clear(), så man inte försöker referera till det avallokerade minnet senare (av misstag).

Det här gäller även arrayen, sätt arrPics[i] = NULL; efter att du friat minnet den pekar på.




Sidor: 1

Forum huvudsida -> Programmering -> List med en strukt som datatyp
Atom feed

Du får inte posta i den här tråden | Till toppen