[C++] STL en arrays

Pagina: 1
Acties:

  • Infern0
  • Registratie: September 2000
  • Laatst online: 20-08 13:36

Infern0

Hou die ontzettende rust!!

Topicstarter
Ik ben bezig met het ontwerpen van een simpel planbord. Nu wil ik gebruik gaan maken van STL en dan vooral de vector functionaliteit. Ik heb de documentatie helemaal gelezen, maar is een dingen wat me niet helemaal duidelijk is.

Ik heb de volgende class:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Class Rooster
{
private:
int WerknemersID;
vector<int> ProjectID; //werknemer zit aan meerder projecten
vector<int> Startuur; // bij elk project ID zit een start/stop
vector<int> Startweek;
vector<int> Stopuur;
vector<int> Stopweek;

public:
// wat functie's om data op te halen en te bewerken
}

Ik wil het dus zo programmeren dat met Rooster[0] de gegevens van werknemer 0 opgevraagt kunnen worden (werknemer aantal is statisch). Dus ik intialiseer gewoon: Rooster[AantalWerknemers]
Nu wil ik dus een functie maken die een nieuwe var aan mijn vector array toevoegt. Dus dit idee als functie aanroep:
VoegProjectDataToe(WerknemerID,ProjectID,StartUur,Startweek,Stopuur,Stopweek)

Dan zit ik met het probleem hoe ik dus Rooster[WerknemerID] moet bewerken, dit anders als in alle voorbeelden die ik gevonden heb omdat hier arrays in mijn class staan.

http://www.bsdfreaks.nl Home site: http://rob.lensen.nu /me was RobL


  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 22:06

Sjonny

Fratser

misschien kan je beter eerst een struct maken met de gegevens en die in je vector proppen?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct data {
  int ProjectID; //werknemer zit aan meerder projecten
  int Startuur; // bij elk project ID zit een start/stop
  int Startweek;
  int Stopuur;
  int Stopweek;
};

class Rooster {
private:
  int WerknemersID;
  vector<data> rooster;
public:
  // zooi ...
};

dan hoef je ook maar 1 iterator te gebruiken ipv 5. voor de rest snap ik het probleem niet zo eigenlijk.

The problem is in the part of your brain that handles intelligence.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 02:22
Op maandag 25 maart 2002 13:15 schreef rlensen het volgende:
Ik ben bezig met het ontwerpen van een simpel planbord. Nu wil ik gebruik gaan maken van STL en dan vooral de vector functionaliteit. Ik heb de documentatie helemaal gelezen, maar is een dingen wat me niet helemaal duidelijk is.

Ik heb de volgende class:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Class Rooster
{
private:
int WerknemersID;
vector<int> ProjectID; //werknemer zit aan meerder projecten
vector<int> Startuur; // bij elk project ID zit een start/stop
vector<int> Startweek;
vector<int> Stopuur;
vector<int> Stopweek;

public:
// wat functie's om data op te halen en te bewerken
}

Ik wil het dus zo programmeren dat met Rooster[0] de gegevens van werknemer 0 opgevraagt kunnen worden (werknemer aantal is statisch). Dus ik intialiseer gewoon: Rooster[AantalWerknemers]
Nu wil ik dus een functie maken die een nieuwe var aan mijn vector array toevoegt. Dus dit idee als functie aanroep:
VoegProjectDataToe(WerknemerID,ProjectID,StartUur,Startweek,Stopuur,Stopweek)

Dan zit ik met het probleem hoe ik dus Rooster[WerknemerID] moet bewerken, dit anders als in alle voorbeelden die ik gevonden heb omdat hier arrays in mijn class staan.
Volgens mij heb je dat laatste verkeerd om, je hebt objecten in je array.

Maar goed, Rooster moet dus een method hebben
code:
1
Rooster::VoegProjectDataToe(ProjectID,StartUur,Startweek,Stopuur,Stopweek)

en in ::VoegProjectDataToe doe je dan gewoon
code:
1
hetRooster[WerknemerID].VoegProjectDataToe (ProjectID,StartUur,Startweek,Stopuur,Stopweek)

Oftewel, de global functie gebruikt de eerste param om de goede Werknemer te vinden, en geeft de rest door aan een member functie.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 19:57
Ik zou van Werknemer en de Roostergegevens ook een object maken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Infern0
  • Registratie: September 2000
  • Laatst online: 20-08 13:36

Infern0

Hou die ontzettende rust!!

Topicstarter
Op maandag 25 maart 2002 14:08 schreef Sjonny het volgende:
misschien kan je beter eerst een struct maken met de gegevens en die in je vector proppen?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct data {
  int ProjectID; //werknemer zit aan meerder projecten
  int Startuur; // bij elk project ID zit een start/stop
  int Startweek;
  int Stopuur;
  int Stopweek;
};

class Rooster {
private:
  int WerknemersID;
  vector<data> rooster;
public:
  // zooi ...
};
Ok dit lijkt me idd beter.
Nog wat kleine vraagjes:
Als ik het goed begrijp moet ik dus zoveel Rooster[i] maken waarin i= Aantalwerknemers?

Ik begrijp nog niet hoe ik een nieuwe struct kan maken mbv die vector.
In de voorbeelden doen ze vooral dit:
foo.push_back(4), dus een waarde toevoegen.

Zou dit voor mijn struct voldoende zijn:
Rooster[i].data.push_back(1,2,3,4,5) ???

http://www.bsdfreaks.nl Home site: http://rob.lensen.nu /me was RobL


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op donderdag 28 maart 2002 00:53 schreef rlensen het volgende:

[..]

Ok dit lijkt me idd beter.
Nog wat kleine vraagjes:
Als ik het goed begrijp moet ik dus zoveel Rooster[i] maken waarin i= Aantalwerknemers?

Ik begrijp nog niet hoe ik een nieuwe struct kan maken mbv die vector.
In de voorbeelden doen ze vooral dit:
foo.push_back(4), dus een waarde toevoegen.

Zou dit voor mijn struct voldoende zijn:
Rooster[i].data.push_back(1,2,3,4,5) ???
Nee je moet een constructor maken voor Data die zijn membervariabelen invult. Dan kan je het volgende doen
code:
1
rooster.push_back(Data(12,20,12,10,14));

Die cijfers worden dus doorgegeven aan de constructor en worden dan in ProjectID, startuur, startweek,enz gezet.
Dit hele object wordt dan in de vector gezet.

  • Infern0
  • Registratie: September 2000
  • Laatst online: 20-08 13:36

Infern0

Hou die ontzettende rust!!

Topicstarter
Op donderdag 28 maart 2002 00:56 schreef Orphix het volgende:

[..]

Nee je moet een constructor maken voor Data die zijn membervariabelen invult. Dan kan je het volgende doen
code:
1
rooster.push_back(Data(12,20,12,10,14));

Die cijfers worden dus doorgegeven aan de constructor en worden dan in ProjectID, startuur, startweek,enz gezet.
Dit hele object wordt dan in de vector gezet.
moet het niet zijn
code:
1
rooster[WerknemersID].push_back(Data(12,20,12,10,14));

Ik heb dus zoals je ziet flink wat problemen met OOP ben dus erg gewend aan C en dit soort dingen vindt ik nog erg lastig, maar ja moet het toch leren. Misschien is dit een code request, maar kan niemand ff een super simpel VB van geven(dus in rooster[i] een nieuwe struct maken en vullen) , want in de VB van STL wordt er gewoon in main wat uitgevoerd en dat begrijp ik allemaal wel, maar de werking via classes en structs vind ik lastig.

http://www.bsdfreaks.nl Home site: http://rob.lensen.nu /me was RobL


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Vanaf welk punt in je code wil je nieuwe toevoegen?
Is dat vanuit je main, of vanuit Rooster?
Ik ging namelijk uit dat je dat stukje code wou in een object van de klasse Rooster. Bedenk dat je eerst een object van een klasse moet maken, en daarmee werk je in je programma!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 19:57
- Maak van je RoosterData een class (of struct, maar dat keyword is eigenlijk een beetje redundant).
- Laat de klasse Rooster een member van het type std::vector<RoosterData *> aanmaken.
- Maak ook een memberfunctie in Rooster die RoosterData * 's kan toevoegen aan je vector.

Als je nu nieuwe rooster aan een werknemer wilt toekennen maak je een nieuw object aan van het type RoosterData . (Waarschijnlijk moet dit dynamisch gebeuren ?), en roep je die memberfunctie aan.

De reden dat ik hier pointers gebruik is dat het je veel copy acties bespaart. (std::vector maakt een kopie van het object als je'm toevoegt)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 02:22
Op donderdag 28 maart 2002 08:49 schreef farlane het volgende:

De reden dat ik hier pointers gebruik is dat het je veel copy acties bespaart. (std::vector maakt een kopie van het object als je'm toevoegt)
Is lang niet altijd het geval; de compiler optimaliseert de copy er vaak uit. De beste syntax daarvoor is
code:
1
2
vector<T> vt;
vt.push_back( T ( 1,2,3 ) );

De compiler moet dan ruimte vinden voor de T(1,2,3) en veel vinden die ruimte dan meteen in de vector.

Afgezien daarvan mag je eigenlijk pas optimaliseren als je programma (1) correct is en (2) te langzaam.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1