Vector van vectoren om matrix te maken

Ik probeer invoer te krijgen voor de afmetingen van een 2D-matrix. En gebruik vervolgens gebruikersinvoer om deze matrix in te vullen. De manier waarop ik dit heb geprobeerd is via vectoren (vectoren van vectoren). Maar ik ben enkele fouten tegengekomen wanneer ik gegevens probeer in te lezen en aan de matrix toe te voegen.

//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];
    }
}

Telkens wanneer ik dit probeer, krijg ik een subscript buiten bereik. Enig advies?


Antwoord 1, autoriteit 100%

Zoals het is, zijn beide dimensies van je vector 0.

In plaats daarvan initialiseer je de vector als volgt:

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

Dit geeft je een matrix van dimensies RR * CCmet alle elementen ingesteld op 0.


Antwoord 2, autoriteit 90%

U moet de vector van vectoren initialiseren tot de juiste grootte voordat u toegang krijgt tot elementen. Je kunt het als volgt doen:

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

Dit creëert een vector van RRgrootte CCvectoren, gevuld met 0.


Antwoord 3, autoriteit 12%

Ik ben niet bekend met c++, maar een snelle blik op de documentatie suggereert dat dit zou moeten werken:

//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);
}

Antwoord 4, Autoriteit 5%

Neem aan dat we de volgende klasse hebben:

#include <vector>
class Matrix {
 private:
  std::vector<std::vector<int>> data;
};

Allereerst wil ik u willen voorstellen om een ​​standaardconstructeur uit te voeren:

#include <vector>
class Matrix {
 public:
  Matrix(): data({}) {}
 private:
  std::vector<std::vector<int>> data;
};

Op dit moment kunnen we de matrix-instantie als volgt maken:

Matrix one;

De volgende strategische stap is om een ​​Reset-methode te implementeren, die twee getalparameters inneemt die respectievelijk het nieuwe aantal rijen en kolommen van de matrix opgeven:

#include <vector>
class Matrix {
 public:
  Matrix(): data({}) {}
  Matrix(const int &rows, const int &cols) {
    Reset(rows, cols);
  }
  void Reset(const int &rows, const int &cols) {
    if (rows == 0 || cols == 0) {
      data.assign(0, std::vector<int>(0));
    } else {
      data.assign(rows, std::vector<int>(cols));
    }
  }
 private:
  std::vector<std::vector<int>> data;
};

Op dit moment verandert de ResetMETHODE DE DIMENTIES VAN DE 2D-MATRIX AAN DE GEGEVEN EN HERSTELLEN ALLE ELEMENTEN. Laat me je een beetje later laten zien waarom we dit nodig hebben.

Nou, we kunnen maken en initialiseren onze matrix:

Matrix two(3, 5);

Laten we Info-methoden voor onze matrix toevoegen:

#include <vector>
class Matrix {
 public:
  Matrix(): data({}) {}
  Matrix(const int &rows, const int &cols) {
    Reset(rows, cols);
  }
  void Reset(const int &rows, const int &cols) {
    data.resize(rows);
    for (int i = 0; i < rows; ++i) {
      data.at(i).resize(cols);
    }
  }
  int GetNumRows() const {
    return data.size();
  }
  int GetNumColumns() const {
    if (GetNumRows() > 0) {
      return data[0].size();
    }
    return 0;
  }
 private:
  std::vector<std::vector<int>> data;
};

Op dit moment kunnen we een aantal triviale matrix-debug-info krijgen:

#include <iostream>
void MatrixInfo(const Matrix& m) {
  std::cout << "{ \"rows\": " << m.GetNumRows()
            << ", \"cols\": " << m.GetNumColumns() << " }" << std::endl;
}
int main() {
  Matrix three(3, 4);
  MatrixInfo(three);
}

De tweede klasse-methode die we op dit moment nodig hebben, is At. Een soort getter voor onze privégegevens:

#include <vector>
class Matrix {
 public:
  Matrix(): data({}) {}
  Matrix(const int &rows, const int &cols) {
    Reset(rows, cols);
  }
  void Reset(const int &rows, const int &cols) {
    data.resize(rows);
    for (int i = 0; i < rows; ++i) {
      data.at(i).resize(cols);
    }
  }
  int At(const int &row, const int &col) const {
    return data.at(row).at(col);
  }
  int& At(const int &row, const int &col) {
    return data.at(row).at(col);
  }
  int GetNumRows() const {
    return data.size();
  }
  int GetNumColumns() const {
    if (GetNumRows() > 0) {
      return data[0].size();
    }
    return 0;
  }
 private:
  std::vector<std::vector<int>> data;
};

De constante Atmethode neemt het rijnummer en kolomnummer en retourneert de waarde in de corresponderende matrixcel:

#include <iostream>
int main() {
  Matrix three(3, 4);
  std::cout << three.At(1, 2); // 0 at this time
}

De tweede, niet-constante Atmethode met dezelfde parameters retourneert een verwijzingnaar de waarde in de corresponderende matrixcel:

#include <iostream>
int main() {
  Matrix three(3, 4);
  three.At(1, 2) = 8;
  std::cout << three.At(1, 2); // 8
}

Laat ten slotte de operator >>implementeren:

#include <iostream>
std::istream& operator>>(std::istream& stream, Matrix &matrix) {
  int row = 0, col = 0;
  stream >> row >> col;
  matrix.Reset(row, col);
  for (int r = 0; r < row; ++r) {
    for (int c = 0; c < col; ++c) {
      stream >> matrix.At(r, c);
    }
  }
  return stream;
}

En test het:

#include <iostream>
int main() {
  Matrix four; // An empty matrix
  MatrixInfo(four);
  // Example output:
  //
  // { "rows": 0, "cols": 0 }
  std::cin >> four;
  // Example input
  //
  // 2 3
  // 4 -1 10
  // 8 7 13
  MatrixInfo(four);
  // Example output:
  //
  // { "rows": 2, "cols": 3 }
}

Voel je vrij om een controle buiten bereik toe te voegen. Ik hoop dat dit voorbeeld je helpt 🙂


Antwoord 5

Vector moet worden geïnitialiseerd voordat het wordt gebruikt als cin>>v[i][j]. Zelfs als het 1D-vector was, heeft het nog steeds een initialisatie nodig, zie deze link

Na initialisatie zullen er geen fouten zijn, zie deze link


Antwoord 6

probeer dit eens. m = row, 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;
}

Antwoord 7

Wat u heeft geïnitialiseerd is een vector van vectoren, dus u moet absoluut een vector opnemen die moet worden ingevoegd(“Gepusht” in de terminologie van vectoren) in de originele vectorheb je matrix genoemd in je voorbeeld.

Nog één ding: u kunt geen waarden rechtstreeks in de vector invoegen met de operator “cin”. Gebruik een variabele die invoer nodig heeft en voeg deze vervolgens in de vector in.

Probeer dit alstublieft:

int num;
for(int i=0; i<RR; i++){
      vector<int>inter_mat;       //Intermediate matrix to help insert(push) contents of whole row at a time
      for(int j=0; j<CC; j++){
           cin>>num;             //Extra variable in helping push our number to vector
           vin.push_back(num);   //Inserting numbers in a row, one by one 
          }
      v.push_back(vin);          //Inserting the whole row at once to original 2D matrix 
}

Antwoord 8

Ik heb deze klas voor dat doel gedaan. Het produceert een variabele grootte matrix (uitbreidbaar) wanneer er meer items worden toegevoegd

” ‘

#pragma once
#include<vector>
#include<iostream>
#include<iomanip>
using namespace std;
template <class T>class Matrix
{
public:
    Matrix() = default;
    bool AddItem(unsigned r, unsigned c, T value)
    {
        if (r >= Rows_count)
        {
            Rows.resize(r + 1);
            Rows_count = r + 1;
        }
        else
        {
            Rows.resize(Rows_count);
        }
        if (c >= Columns_Count )
        {
            for (std::vector<T>& row : Rows)
            {
                row.resize(c + 1);
            }
            Columns_Count = c + 1;
        }
        else
        {
            for (std::vector<T>& row : Rows)
            {
                row.resize(Columns_Count);
            }
        }
        if (r < Rows.size())
            if (c < static_cast<std::vector<T>>(Rows.at(r)).size())
            {
                (Rows.at(r)).at(c) = value;
            }
            else
            {
                cout << Rows.at(r).size() << " greater than " << c << endl;
            }
        else
            cout << "ERROR" << endl;
        return true;
    }
    void Show()
    {
        std::cout << "*****************"<<std::endl;
        for (std::vector<T> r : Rows)
        {
            for (auto& c : r)
                std::cout << " " <<setw(5)<< c;
            std::cout << std::endl;
        }
        std::cout << "*****************" << std::endl;
    }
    void Show(size_t n)
    {
        std::cout << "*****************" << std::endl;
        for (std::vector<T> r : Rows)
        {
            for (auto& c : r)
                std::cout << " " << setw(n) << c;
            std::cout << std::endl;
        }
        std::cout << "*****************" << std::endl;
    }
//  ~Matrix();
public:
    std::vector<std::vector<T>> Rows;
    unsigned Rows_count;
    unsigned Columns_Count;
};

”’

Other episodes