2013-10-01 1 views
1

Veuillez regarder le petit code de test + sortie fourni ci-dessous. Il semble que lorsque vous utilisez push_back() sur un vecteur std :: dans une boucle, C++ alloue la mémoire à des adresses 'aléatoires', puis recopie les données dans des adresses mémoire consécutives après la fin de la boucle. Est-ce à voir avec le fait que la taille du vecteur n'est pas connue avant la boucle?Pourquoi les adresses d'éléments vectoriels ne sont-elles pas consécutives lorsqu'elles sont affectées avec push_back()?

Quelle est la bonne façon de faire ce que je fais dans le code de test? Dois-je assigner les pointeurs dans une autre boucle après la sortie du premier? Notez que je ne peux pas définir la taille du vecteur avant la première boucle, car en réalité c'est en fait un vecteur d'objets de classe qui nécessitent une initialisation.

Nous vous remercions de votre aide.

std::vector<int> MyVec; 
std::vector<int *> MyVecPtr; 

for (int i = 0; i < 10; i++) 
{ 
    MyVec.push_back(i); 

    MyVecPtr.push_back(&MyVec.back()); 

    std::cout << MyVec.back() << " " 
       << &MyVec.back() << " " 
       << MyVecPtr.back() << " " 
       << *MyVecPtr.back() << std::endl; 
} 

std::cout << std::endl; 

for (int i = 0; i < MyVec.size(); i++) 
{ 
    std::cout << MyVec[i] << " " 
       << &MyVec[i] << " " 
       << MyVecPtr[i] << " " 
       << *MyVecPtr[i] << std::endl; 
} 

0 0x180d010 0x180d010 0 
1 0x180d054 0x180d054 1 
2 0x180d038 0x180d038 2 
3 0x180d03c 0x180d03c 3 
4 0x180d0b0 0x180d0b0 4 
5 0x180d0b4 0x180d0b4 5 
6 0x180d0b8 0x180d0b8 6 
7 0x180d0bc 0x180d0bc 7 
8 0x180d140 0x180d140 8 
9 0x180d144 0x180d144 9 

0 0x180d120 0x180d010 25219136 
1 0x180d124 0x180d054 0 
2 0x180d128 0x180d038 2 
3 0x180d12c 0x180d03c 3 
4 0x180d130 0x180d0b0 4 
5 0x180d134 0x180d0b4 5 
6 0x180d138 0x180d0b8 6 
7 0x180d13c 0x180d0bc 7 
8 0x180d140 0x180d140 8 
9 0x180d144 0x180d144 9 
+4

il se réalloue lorsqu'il manque d'espace. – Borgleader

+1

Essayez d'utiliser le .reserve (10), puis voir si les adresses de mémoire changent – yizzlez

+0

Ils sont consécutifs, vous ne faites qu'interpréter la sortie de votre programme. – Slava

Répondre

1

Si vous savez combien d'insertions vous effectuerez, vous devez utiliser reserve() sur votre vector en conséquence. Cela éliminera le besoin de tout redimensionnement qu'il effectuerait autrement lorsque la capacité est dépassée.

MyVec.reserve(10); 
for (int i = 0; i < 10; i++) 
{ 
    MyVec.push_back(i); 
    //... 
Questions connexes