abonnement Unibet Coolblue Bitvavo
pi_114975591
Ik loop weer ergens mee vast. Wat ik wil doen is de vereniging van twee willekeurig grote verzamelingen bepalen. De verzamelingen codeer ik als vectors. Het idee van de code is als volgt. Stel ik wil de vereniging van vector a en van b. Dan definieer ik een vector c die bestaat uit alle elementen uit b, en alle elementen uit a die niet in b zitten (zodat ik geen duplicaten creëer).

Ik heb er een hele tijd naar zitten staren, en gedebugged, maar ik kan maar niet de fout vinden in mijn code.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <vector>

using namespace std;

vector<int> vereniging(vector<int> a, vector<int> b)
{
    vector<int> c=b;
    for(int k=0; k<a.size(); k++)
    {
        int check=-1;
        int l(0);
        for(l=0; l<b.size(); l++)
        {
            if(a[l]==b[k])
            {
                check++;
                break;
            }
        }
        if(check<0)
        {
            c.push_back(a[k]);
        }
    }
    return c;
}

int main()
{
    int a[]={3,0,45,55,66};
    vector<int> m;
    m.assign(a,a+5);
    int b[]={3,4};
    vector<int> n;
    n.assign(b,b+2);
    cout << vereniging(m,n)[0] << endl << vereniging(m,n)[1] << endl << vereniging(m,n)[2] << endl<< vereniging(m,n)[3] << endl << vereniging(m,n)[4] << endl << vereniging(m,n)[5];
}

Zou natuurlijk als output de vector [3,4,0,45,55,66] moeten geven. Maar ik krijg [3,4,0,55,55,1112944187] :?
pi_114975700
quote:
0s.gif Op woensdag 1 augustus 2012 23:58 schreef thenxero het volgende:
Ik loop weer ergens mee vast. Wat ik wil doen is de vereniging van twee willekeurig grote verzamelingen bepalen. De verzamelingen codeer ik als vectors.
STL heeft een datatype set, zou je ook kunnen gebruiken.
pi_114975907
quote:
0s.gif Op donderdag 2 augustus 2012 00:00 schreef thabit het volgende:

[..]

STL heeft een datatype set, zou je ook kunnen gebruiken.
Wat zijn de voordelen van dat datatype? Kan je daar wel makkelijk verenigingen mee maken?

En ik wil alsnog wel graag weten wat er mis is met mijn code, heb er echt uren naar zitten turen :(
pi_114976061
quote:
0s.gif Op donderdag 2 augustus 2012 00:04 schreef thenxero het volgende:

[..]

Wat zijn de voordelen van dat datatype? Kan je daar wel makkelijk verenigingen mee maken?
Jouw code heeft looptijd O(nm), een verzamelingendatatype kan het in O((n+m)log(n+m)).
pi_114976193
OK dat moet ik dan maar gaan bestuderen. Zie je zo snel geen fout in mijn algoritme?
pi_114976264
quote:
0s.gif Op donderdag 2 augustus 2012 00:09 schreef thenxero het volgende:
OK dat moet ik dan maar gaan bestuderen. Zie je zo snel geen fout in mijn algoritme?
Weet je wat copy-constructors zijn en waar ze in je code impliciet aangeroepen worden?
pi_114976350
quote:
0s.gif Op donderdag 2 augustus 2012 00:10 schreef thabit het volgende:

[..]

Weet je wat copy-constructors zijn en waar ze in je code impliciet aangeroepen worden?
Nee.

edit; even snel gegoogled, bedoel je de regel: vector<int> c=b;?
pi_114976474
quote:
0s.gif Op donderdag 2 augustus 2012 00:12 schreef thenxero het volgende:

[..]

Nee
Het kan handig zijn om je daar over in te lezen. ;).
pi_114976516
quote:
0s.gif Op donderdag 2 augustus 2012 00:12 schreef thenxero het volgende:

[..]

Nee.

edit; even snel gegoogled, bedoel je de regel: vector<int> c=b;?
Onder andere, maar ook bijvoorbeeld in de functie-aanroep worden ze gebruikt, en in het returnen van die vector.
pi_114976726
Punt is dat je die vectors beter als reference kunt passen in de functie, maar daar zit de fout op zich niet. Die zit namelijk hier:

1 if(a[l]==b[k])
Je hebt k en l verwisseld.
pi_114976900
quote:
0s.gif Op donderdag 2 augustus 2012 00:18 schreef thabit het volgende:
Punt is dat je die vectors beter als reference kunt passen in de functie, maar daar zit de fout op zich niet. Die zit namelijk hier:
[ code verwijderd ]

Je hebt k en l verwisseld.
O M G :') . Bedankt!

Ik snap niet echt wat je bedoeld met die reference. Ik weet net pas wat pointers zijn, waar ik ook het nut nog niet echt van snap.
pi_114977332
quote:
0s.gif Op donderdag 2 augustus 2012 00:22 schreef thenxero het volgende:

[..]

O M G :') . Bedankt!

Ik snap niet echt wat je bedoeld met die reference. Ik weet net pas wat pointers zijn, waar ik ook het nut nog niet echt van snap.
Okee, dan zou ik me daar ook over inlezen, dit soort dingen zijn zo ongeveer hétgene waar C++ van aan elkaar hangt.

Dit is wel een goede bron voor de basics van C++ (aangenomen dat je enigszins met C bekend bent): http://www.drbio.cornell.(...)one-html/Frames.html
pi_114978512
quote:
0s.gif Op donderdag 2 augustus 2012 00:31 schreef thabit het volgende:

[..]

Okee, dan zou ik me daar ook over inlezen, dit soort dingen zijn zo ongeveer hétgene waar C++ van aan elkaar hangt.

Dit is wel een goede bron voor de basics van C++ (aangenomen dat je enigszins met C bekend bent): http://www.drbio.cornell.(...)one-html/Frames.html
Als hij nog niet zoveel van pointers weet dan is hij eigenlijk niet bekend met C :P
pi_114978518
quote:
0s.gif Op donderdag 2 augustus 2012 00:31 schreef thabit het volgende:

[..]

Okee, dan zou ik me daar ook over inlezen, dit soort dingen zijn zo ongeveer hétgene waar C++ van aan elkaar hangt.

Dit is wel een goede bron voor de basics van C++ (aangenomen dat je enigszins met C bekend bent): http://www.drbio.cornell.(...)one-html/Frames.html
Bedankt. Ik ben niet bekend met C. Het enige wat ik weet is alles wat hier staat, tot het over pointers gaat. Ik heb daarmee nu de eerste 10 problemen van PE opgelost, dus ik wil nu weer verder leren.
Ik zal het een keer gaan lezen en dan zie ik wel hoe ver ik kom.
  donderdag 2 augustus 2012 @ 13:08:39 #105
189216 netolk
maar dan andersom
pi_114992442
Voor een goede pointer uitleg kun je ook op youtube kijken dan moet je even zoeken naar pointer fun ik zit nu op mijn mobiel alleen dan doet youtube raar als ik de link van het filmpje wil. Een reference is eigenlijk een soort pointer, hij wijst naar een bepaald object die je vervolgens kan bewerken (is heel handig als functies bijvoorbeeld wat toe moeten voegen aan een vector)
Beware of the Raping Zebra's
pi_114995032
Een reference is een pointer waarbij je in de notatie het sterretje weglaat. Andere verschillen: een reference kan niet 0 zijn, moet direct geïnitialiseerd worden, en kan daarna niet veranderd worden.
pi_114995536
Een toepassing van references in jouw code zou bijvoorbeeld kunnen zijn dat je
1vector<int> vereniging(vector<int> a, vector<int> b)
vervangt door
1vector<int> vereniging(vector<int>& a, vector<int>& b)
In het bovenste geval worden er bij het doorgeven van de vectoren copy-constructors op a en b uitgevoerd, en destructors bij het verlaten van de functie. In het onderste geval worden er references naar reeds bestaande vectoren doorgegeven, en hoeven er op a en b geen constructors of destructors te worden uitgevoerd.
pi_114995621
quote:
0s.gif Op donderdag 2 augustus 2012 13:57 schreef thabit het volgende:
[...] een reference kan niet 0 zijn [...]
1int const &a = 0;
:)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_114995928
quote:
0s.gif Op donderdag 2 augustus 2012 14:10 schreef GS42 het volgende:

[..]
[ code verwijderd ]

:)
Okee, okee, maar de C++ standaard definieert geen null references, in tegenstelling tot Java, waar references null by default zijn en ook kunnen veranderen.
pi_115007412
quote:
0s.gif Op donderdag 2 augustus 2012 14:08 schreef thabit het volgende:
Een toepassing van references in jouw code zou bijvoorbeeld kunnen zijn dat je
[ code verwijderd ]

vervangt door
[ code verwijderd ]

In het bovenste geval worden er bij het doorgeven van de vectoren copy-constructors op a en b uitgevoerd, en destructors bij het verlaten van de functie. In het onderste geval worden er references naar reeds bestaande vectoren doorgegeven, en hoeven er op a en b geen constructors of destructors te worden uitgevoerd.
Neem dan ook gelijk een constant reference, is wat netter. :)
pi_115022393
quote:
0s.gif Op donderdag 2 augustus 2012 14:08 schreef thabit het volgende:
Een toepassing van references in jouw code zou bijvoorbeeld kunnen zijn dat je
[ code verwijderd ]

vervangt door
[ code verwijderd ]

In het bovenste geval worden er bij het doorgeven van de vectoren copy-constructors op a en b uitgevoerd, en destructors bij het verlaten van de functie. In het onderste geval worden er references naar reeds bestaande vectoren doorgegeven, en hoeven er op a en b geen constructors of destructors te worden uitgevoerd.
Wordt de code daar sneller door? Of wat zijn anders de voordelen?
pi_115022441
quote:
0s.gif Op donderdag 2 augustus 2012 22:27 schreef thenxero het volgende:

[..]

Wordt de code daar sneller door?
In het algemeen wel, al kan het nooit kwaad om het te testen.
pi_115025456
quote:
0s.gif Op donderdag 2 augustus 2012 13:08 schreef netolk het volgende:
Voor een goede pointer uitleg kun je ook op youtube kijken dan moet je even zoeken naar pointer fun

_O-
pi_115028537
in C++ heb je trouwens iets veel beters dan malloc :)

Daar kan je gewoon dit doen:
int *iptr = new int;

ipv
int *iptr = malloc(sizeof(int));
pi_115030810
quote:
0s.gif Op donderdag 2 augustus 2012 23:58 schreef t4rt4rus het volgende:
in C++ heb je trouwens iets veel beters dan malloc :)

Daar kan je gewoon dit doen:
int *iptr = new int;

ipv
int *iptr = malloc(sizeof(int));
Ja zo heb ik het ook geleerd. Dat malloc vond ik al vaag, maar dat is dus voor C.
  vrijdag 3 augustus 2012 @ 01:00:28 #116
189216 netolk
maar dan andersom
pi_115031632
Ja er bestaat er ook een voor c++ het enige verschil is dat malloc word vervangen door new
Beware of the Raping Zebra's
  vrijdag 3 augustus 2012 @ 09:46:07 #117
314941 Ai_KaRaMBa
Eat my shorts!
pi_115038590
Let daarmee op dat je in C++ 2 soorten "free()" hebt!! Als je het verkeerd doet, krijg je memory leaks...

1
2
3
4
5
6
7
int *a = new int;
int *b = new int[10];

// ...

delete a;
delete[] b;

versus

1
2
3
4
5
6
7
int *a = (int*)malloc(sizeof(int));
int *b = (int*)malloc(sizeof(int)*10);

//...

free(a);
free(b);
pi_115038928
quote:
0s.gif Op vrijdag 3 augustus 2012 00:43 schreef thenxero het volgende:

[..]

Ja zo heb ik het ook geleerd. Dat malloc vond ik al vaag, maar dat is dus voor C.
Het is niet vaag. Het enigste wat het doet is memory alloceren voor waar de integer in geplaatst kan worden. Met sizeof(int) vraagt hij de grootte op van een integer in bytes. Met malloc reserveerd hij vervolgens dus die grootte.
  vrijdag 3 augustus 2012 @ 17:18:49 #119
189216 netolk
maar dan andersom
pi_115059480
Klopt idd alleen is new veel duidelijker en overzichtelijker in gebruik
Beware of the Raping Zebra's
pi_115059990
quote:
0s.gif Op vrijdag 3 augustus 2012 09:46 schreef Ai_KaRaMBa het volgende:
Let daarmee op dat je in C++ 2 soorten "free()" hebt!! Als je het verkeerd doet, krijg je memory leaks...
[ code verwijderd ]

versus
[ code verwijderd ]

Het nut daarvan begrijp ik nog niet echt...

En was het niet zo dat je delete[] bij alles kon gebruiken?
1
2
int *i = new int;
delete[] i;

Oh wacht is het mogelijk om dit te doen?
1
2
3
4
int *i = new int[4];
delete &i[3];
delete[] &i[1];
delete i;
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')