vector self appending

Status
Niet open voor verdere reacties.

po0ky

Nieuwe gebruiker
Lid geworden
28 mrt 2010
Berichten
2
Hoi ik heb 'vreemd' probleem;

[CPP]
#include <vector>
#include <iostream>
#include <string>

int main(){
std::vector<std::string> strvec;
strvec.push_back("A");
strvec.push_back("B");
strvec.push_back("C");
strvec.push_back("D");
strvec.push_back("E");

std::vector<std::string>::size_type i = strvec.size()-1;
for(;i>0;--i)
strvec.push_back(strvec[i-1]);

for each(std::string str in strvec)
std::cout << str << '\n';

return 0;
}
[/CPP]

Resultaat:
Code:
A
B
C
D
E
D

B
A

Hier klopt iets niet. Waar ik een tweede C verwachte staat nu helemaal niets.
Ik heb het al op diverse manieren geprobeerd.
 
Je functionaliteit zou gewoon moeten werken. (en doet dat bij mij ook). Dus ik ben geneigd om "for each" the schuld te geven. Dit is namelijk geen standaard C++, maar iets wat VS hefet bedacht (zie http://msdn.microsoft.com/en-us/library/xey702bw(VS.80).aspx). Misschien kun je het eens proberen met een ouderwetse for-loop? :
[cpp]
for (size_t j = 0; j != strvec.size(); ++j)
std::cout << strvec.at(j) << '\n';
[/cpp]
 
Ik denk dat de functie niet goed werkt omdat ik de vector een referentie naar een item van de vector zelf geef. Mogelijk veranderd de vector de locatie van bepaalde items als de vector groeit.

De vector groeit en de locatie van het gerefereerde veranderd waardoor de referentie niet meer geldig is.

De oplossing:

strvec.push_back(std::string(strvec[i-1]));

We copieren het gerefeerde eerst naar een tijdelijk object. De vector groeit en we voegen de inhoud van het tijdelijk object toe.
 
Laatst bewerkt:
Ik denk dat de functie niet goed werkt omdat ik de vector een referentie naar een item van de vector zelf geef. Mogelijk veranderd de vector de locatie van bepaalde items als de vector groeit.

De vector groeit en de locatie van het gerefereerde veranderd waardoor de referentie niet meer geldig is.
Scherp, daar had ik helemaal overgekeken toen ik je probleem bekeek.
Je zou kunnen nagaan of dit effectief het gedrag bij jou is, door in je lus waarin je de push_back doet ook telkens de capacity op te vragen, als het 'goed' is, zou deze gewijzigd moeten zijn bij de push_back van C..

Zie ook http://www.cplusplus.com/reference/stl/vector/push_back/
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan