Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Vector

Ostatnio zmodyfikowano 2021-09-24 15:04
Autor Wiadomość
krystian123456
Temat założony przez niniejszego użytkownika
Vector
» 2021-09-23 09:59:28
Dlaczego poniższy program daje takie rezultaty? Czy te adresy nie powinny być sobie równe?

C/C++
#include <iostream>
#include <vector>
using namespace std;

int main()
{
   
int p[ 4 ];
   
   
vector < int > k;
   
   
for( int i = 0; i < 4; i++ )
   
{
       
p[ i ] = i * i;
       
k.push_back( p[ i ] );
       
cout << & k[ i ] << endl;
   
}
   
   
cout << endl;
   
   
   
for( int i = 0; i < 4; i++ )
   
{
       
cout << & k[ i ] << endl;
   
}
   
   
cout << endl;
   
   
for( int i = 0; i < 4; i++ )
   
{
       
cout << & k[ i ] << endl;
   
}
   
   
   
return 0;
}


008E51A8
008EE5D4
008EEAA8
008E4EF4

008E4EE8
008E4EEC
008E4EF0
008E4EF4

008E4EE8
008E4EEC
008E4EF0
008E4EF4
P-178975
pekfos
» 2021-09-23 16:26:19
std::vector<> przenosi dane w pamięci, jeśli nie ma miejsca na dodanie elementów.
P-178976
krystian123456
Temat założony przez niniejszego użytkownika
» 2021-09-23 22:52:42
Czyli jak to rozumieć? Na początku zarezerwował w innym miejscu a potem przeniósł?
P-178977
pekfos
» 2021-09-24 15:04:41
Tak. Elementy wektora zajmują ciągły obszar pamięci i wektor automatycznie alokuje większy obszar jeśli operacja wstawienia przekracza aktualną pojemność.
C/C++
std::vector < int > v;
for( int i = 0; i < 20; ++i )
{
   
v.push_back( 0 );
   
std::cout <<( void * ) & v[ 0 ] << ' ' << v.size() << '/' << v.capacity() << '\n';
}
0xc313f0 1/1
0xc31410 2/2
0xc313f0 3/4
0xc313f0 4/4
0xc31410 5/8
0xc31410 6/8
0xc31410 7/8
0xc31410 8/8
0xc31870 9/16
0xc31870 10/16
0xc31870 11/16
0xc31870 12/16
0xc31870 13/16
0xc31870 14/16
0xc31870 15/16
0xc31870 16/16
0xc318c0 17/32
0xc318c0 18/32
0xc318c0 19/32
0xc318c0 20/32
P-178978
« 1 »
  Strona 1 z 1