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

Powiększanie rozmiaru wielowymiarowego wektora

Ostatnio zmodyfikowano 2018-06-24 14:19
Autor Wiadomość
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?
P-171654
mateczek
» 2018-06-23 20:38:51
C/C++
#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;
}
P-171655
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)?
P-171656
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) ...
P-171657
mateczek
» 2018-06-23 21:51:01
może napisz co chcesz osiągnąć a ktoś podsunie lepsze rozwiązanie??
C/C++
#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;
}
P-171658
Ranger281
Temat założony przez niniejszego użytkownika
» 2018-06-23 22:25:48
Mam taki kod:
C/C++
V.resize( v.size() + 3 );
V[ 0 ].resize( v[ 0 ].size() + 3 );
V[ 0 ][ 0 ].resize( v[ 0 ][ 0 ].size() + 3 );
Następnie przypisuję
C/C++
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).

P-171659
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ć.
P-171661
mateczek
» 2018-06-24 08:02:53
V[ 1 ][ 0 ][ 0 ] = x;
wyświetl rozmiar wektora V[1]
C/C++
cout << V[ 1 ].size();
A stanie się jasne dlaczego nic nie możesz tam zapisać.

Może taka propozycja ??
C/C++
#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 ); // tablica 3X3X3
    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;
}
P-171663
« 1 » 2
  Strona 1 z 2 Następna strona