2012-09-11 17 views
25

Próbuję wprowadzić dane wejściowe dla wymiarów macierzy 2D. Następnie użyj danych wprowadzonych przez użytkownika, aby wypełnić tę macierz. Sposób, w jaki próbowałem to zrobić, był przez wektory (wektory wektorów). Ale napotkałem kilka błędów, gdy próbuję odczytać dane i dołączyć je do macierzy.Wektor wektorów do tworzenia macierzy

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    for(int j = 0; j<CC; j++) 
    { 
    cout<<"Enter the number for Matrix 1"; 
     cin>>matrix[i][j]; 
    } 
} 

Ilekroć próbuję to zrobić, daje mi błąd z podpisem dolnym zakresu. Jakakolwiek rada?

+3

Nie zainicjalizowałeś 'macierzy'. – elyashiv

+0

@elyashiv faktycznie, 'matrix' jest inicjowany. –

+1

@Luchian Grigore Wektory są początkowo puste. w związku z tym błąd poza zasięgiem. –

Odpowiedz

43

Jak to jest, oba wymiary swojej wektora wynoszą 0.

Zamiast zainicjować wektor jak to:

vector<vector<int> > matrix(RR); 
for (int i = 0 ; i < RR ; i++) 
    matrix[i].resize(CC); 

to daje macierz o wymiarach RR * CC ze wszystkimi elementami ustawionymi na 0 .

+1

Można utworzyć wektor wielkości "RR" wielkości wektorów "CC" w jednej instrukcji i uniknąć zmiany rozmiaru. – juanchopanza

+0

@juanchopanza mówisz o std :: generate lub just assignment? –

5

nie jestem obeznany z C++, ale szybkie spojrzenie na dokumentacji sugeruje, że to powinno działać:

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    vector<int> myvector; 
    for(int j = 0; j<CC; j++) 
    { 
     int tempVal = 0; 
     cout<<"Enter the number for Matrix 1"; 
     cin>>tempVal; 
     myvector.push_back(tempVal); 
    } 
    matrix.push_back(myvector); 
} 
+3

Prawidłowo, ale ma to wpływ na kary za wyniki spowodowane późniejszym odpychaniem. –

+8

@LuchianGrigore: Czytanie matrycy ze std :: cin zabija twoją argumentację na temat wydajności – stefan

90

Trzeba zainicjować wektor wektorów do odpowiedniego rozmiaru przed uzyskaniem dostępu do żadnych elementów. Można to zrobić tak:

// assumes using std::vector for brevity 
vector<vector<int>> matrix(RR, vector<int>(CC)); 

To tworzy wektor RR wielkości CC wektorów, wypełnione 0.

+1

+1: To też robię. Zaskoczony jesteś jedynym, który dał tę odpowiedź. Na marginesie nigdy nie użyłbym wektora wektorów do przedstawienia macierzy. =) – paddy

+1

@paddy Nie użyłbym tego również. Pomysł, aby w dowolnym momencie dowolnie zmienić dowolną kolumnę lub wiersz, lub zmienić wymiary matrycy po stworzeniu, jest dla mnie zbyt przerażający. – juanchopanza

+0

To normalne, zmieniać wymiary matrycy (w MatLab robisz to przez cały czas), ale w rzeczywistym użyciu macierz jest ciągłym blokiem, a wszystko, co zmieniasz, to rzędy/cols (w zasadzie śledzenie kroku) -lengths) - aby indeksować element w macierzy, oblicza się indeks liniowy z indeksu wielowymiarowego. – paddy

1

spróbuj tego. m = wiersz, n = col

vector< vector<int> > matrix(m,vector<int>(n)); 

for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cin>>matrix[i][j]; 
    } 
    cout<<endl; 
} 
cout<<"::matrix::"<<endl; 
for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cout<<matrix[i][j]<<" "; 
    } 
    cout<<endl; 
} 
Powiązane problemy