Vector
Ostatnio zmodyfikowano 2021-09-24 15:04
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? #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
|
|
pekfos |
» 2021-09-23 16:26:19 std::vector<> przenosi dane w pamięci, jeśli nie ma miejsca na dodanie elementów. |
|
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ł? |
|
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ść. 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 |
|
« 1 » |