Ranger281 Temat założony przez niniejszego użytkownika |
Powiększanie rozmiaru wielowymiarowego wektora » 2018-06-23 20:04:39 Witam, stworzyłem taki wektor: std::vector < vector < vector < std::string > > > v do którego wprowadzam na przykład zmienną: v[ 0 ][ 0 ][ 0 ] = zmienna . Przy kompilacji nie ma błędów, ale program nie działa, ponieważ xxx nie ma zarezerwowanego miejsca. Próbowałem je przydzielić za pomocą funkcji resize() i reserve(), ale działały tylko w przypadku zastosowania jednowymiarowych kontenerów. W jaki sposób przydzielić pamięć dla wielowymiarowego wektora? |
|
mateczek |
» 2018-06-23 20:38:51 #include <iostream> #include<vector> using namespace std;
int main() { vector < vector < string >> v; v.resize( 2 ); for( int i = 0; i < v.size(); i++ ) { v[ i ].resize( 3 ); } v[ 1 ][ 2 ] = "ala ma kota" << endl; cout << v[ 1 ][ 2 ]; v[ 1 ].push_back( "ala dokupiła kota" ); cout << v[ 1 ].size(); return 0; }
|
|
Ranger281 Temat założony przez niniejszego użytkownika |
» 2018-06-23 21:23:24 W jaki sposób zastosować ten kod dla trójwymiarowego wektora, który ma być powiększony tylko o 1 pole dla każdego wymiaru [x][y][z]? v[x][y][z].resize(v.size() + 1)? |
|
garlonicon |
» 2018-06-23 21:42:39 1) resize na wektorze 2) resize na każdym wektorze[ indeks ] 3) resize na każdym wektorze[ indeks ][ indeks ] 4) ... |
|
mateczek |
» 2018-06-23 21:51:01 może napisz co chcesz osiągnąć a ktoś podsunie lepsze rozwiązanie?? #include <iostream> #include<vector> using namespace std;
int main() { vector < vector < vector < string >>> v( 3, vector < vector < string >>( 3, vector < string >( 3 ) ) ); cout << v.size() << " " << v[ 0 ].size() << " " << v[ 0 ][ 0 ].size() << endl; size_t new_size = v.size() + 1; v.resize( new_size ); for( size_t i = 0; i < new_size; i++ ) { v[ i ].resize( new_size ); for( size_t j = 0; j < new_size; j++ ) { v[ i ][ j ].resize( new_size ); } } cout << v.size() << " " << v[ 0 ].size() << " " << v[ 0 ][ 0 ].size() << endl; }
|
|
Ranger281 Temat założony przez niniejszego użytkownika |
» 2018-06-23 22:25:48 Mam taki kod: V.resize( v.size() + 3 ); V[ 0 ].resize( v[ 0 ].size() + 3 ); V[ 0 ][ 0 ].resize( v[ 0 ][ 0 ].size() + 3 );
Następnie przypisuję V[ 1 ][ 0 ][ 0 ] = x; V[ 1 ][ 1 ][ 0 ] = y; V[ 1 ][ 1 ][ 1 ] = z;
Po przydzieleniu zmiennej y występuje błąd (out of range). |
|
garlonicon |
» 2018-06-23 22:46:42 Nic dziwnego, skoro indeksowanie zaczyna się od zera. A jak napisałem wcześniej, resize robisz dla każdego elementu osobno. Nic nie stoi na przeszkodzie, aby V[ 0 ] miał rozmiar 5, a V[ 1 ] mógł przechowywać 11 elementów. To jest wektor, przyjmie dowolny rozmiar, więc trzeba dla każdego indeksu go ustawiać. |
|
mateczek |
» 2018-06-24 08:02:53 wyświetl rozmiar wektora V[1] A stanie się jasne dlaczego nic nie możesz tam zapisać. Może taka propozycja ?? #include <iostream> using namespace std; class matrix3D { string * dane; int size; public: matrix3D( int _size ) { size = _size; dane = new string[ size * size * size ]; } ~matrix3D() { delete[] dane; } string & operator ()( int x, int y, int z ) { int index = z * size * size + y * size + x; return dane[ index ]; } }; int main() { matrix3D m( 3 ); m( 2, 2, 1 ) = "Ala ma kotka"; m( 2, 2, 0 ) = "Alicja ma tygrysa"; cout << m( 2, 2, 1 ) << " a " << m( 2, 2, 0 ) << endl; }
|
|
« 1 » 2 |