[C++] bizar gedrag std::vector<bla> getter functie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 20-09 11:26
Ik heb volgende class:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Custom{
  //...
};

class A {

  public:
    A() { // zorg dat er iets in vec_ zit }
    const std::vector<Custom>& getVector() const {return vec_;}

  private:
    std::vector<Custom> vec_;

};


Niets bijzonders dus, volgens mij toch.
Deze class gebruikte ik op de volgende manier:

C++:
1
2
3
4
5
A aObj;
vector<Custom>::const_iterator it;
  for(it = aObj.getVector().begin(); it!=aObj.getVector().end(); it++){
cout << *it << endl;
}


Nu was het zo dat de for loop regelmatig rommel uitspuwde, ipv de waarden die in de vector vec_ zaten. Dit gedrag verdween wanneer ik ipv telkens de vector getter in de for loop aan te roepen, eerst een lokale vector aanmaakte:
C++:
1
vector<Custom> local = aObj.getVector();

en die dan in de for loop gebruikte.

Mijn eerste aanpak leek me niet fout, maar waarom is die dan toch fout?

Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Op basis van bovenstaande is dit onmogelijk te beantwoorden.
Ik vermoed dat je enkele cruciale onderdelen hebt weggelaten :)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Misschien pas je je vector aan tijdens de loop? Dat invalidate je iterators.

(Trouwens, je kan meestal beter ++it gebruiken dan it++; kan in performance schelen als je compiler onnodige kopie niet weg optimized)

Acties:
  • 0 Henk 'm!

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 20-09 11:26
Grrmbl. Mijn volgende niet triviale progsels zal ik altijd met versiecontrole doen.
Het lag inderdaad niet aan het stukje code dat ik heb gepost, want dat heb ik er nu weer in gestoken, zonder dat het problemen veroorzaakt. Ik houd het op headers en object code die out of sync tot het uiteindelijke programma werden gecompileerd. Heb ik nog al rare toestanden mee voorgehad, ik denk dat mijn Makefiles niet helemaal koosjer zijn.

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik vermoed dat je de & vergeten bent. Vrij subtiel verschil - het compileert nog steeds, alleen is je getVector().begin() het begin van één kopie en getVector().end() het einde van een andere kopie.

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


Acties:
  • 0 Henk 'm!

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 20-09 11:26
Zeer goed mogelijk, wat ook af en toe voorkwam is dat de loop veel langer duurde (het duurde dus langer eer hij genoeg ++ deed om aan de zogezegde .end() te komen) dan normaal.
Pagina: 1