创建矩阵的向量

我正在尝试输入一个二维矩阵的维数。然后使用用户输入来填充这个矩阵。我尝试这样做的方法是通过向量(向量的向量)。但是,每当我试图读入数据并将其添加到矩阵中时,都会遇到一些错误。

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

无论何时我尝试这样做,它都会给我一个超出范围的下标错误。有什么建议吗?

306140 次浏览

事实上,矢量的两个维度都是0。

取而代之的是,将向量初始化为:

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

这将为您提供一个尺寸为 RR * CC的矩阵,其中所有元素都设置为 0

我对 c + + 并不熟悉,但是快速浏览一下文档就会发现这个应该可行:

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

在访问任何元素之前,必须将向量的向量初始化为适当的大小。你可以这样做:

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

这将创建一个 RR大小的 CC向量,其中填充 0

试试这个 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;
}

你已经初始化的是一个 向量向量,所以你的 必须包含一个要插入的矢量(“推”在矢量的术语中) 在原始矢量中你已经在你的例子中命名了矩阵。

还有一点,您不能直接使用操作符“ cin”在向量中插入值。使用一个接受输入的变量,然后在向量中插入相同的变量。

请试试这个:

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
}

在使用 Vector 作为 cin>>v[i][j]之前,需要对其进行初始化。即使它是一维矢量,它仍然需要一个初始化,看看这个链接

初始化后不会有错误,看看这个链接

假设我们有以下课程:

#include <vector>


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

首先,我建议你实施一个缺省构造函数:

#include <vector>


class Matrix {
public:
Matrix(): data({}) {}


private:
std::vector<std::vector<int>> data;
};

此时,我们可以创建如下 Matrix 实例:

Matrix one;

下一个战略步骤是实现一个 Reset方法,它接受两个整数参数,分别指定矩阵的新行数和新列数:

#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;
};

此时,Reset方法将2D 矩阵的维数改变为给定的维数,并重置其所有元素。让我稍后告诉你为什么我们可能需要这个。

那么,我们可以创建 初始化我们的矩阵:

Matrix two(3, 5);

让我们为矩阵添加信息方法:

#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;
};

这时我们可以得到一些简单的矩阵调试信息:

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

我们现在需要的第二个类方法是 At:

#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;
};

常量 At方法获取行号和列号,并返回相应矩阵单元格中的值:

#include <iostream>


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

第二个具有相同参数的非常数 At方法返回一个 参考文献到相应矩阵单元格中的值:

#include <iostream>


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

最后让我们实现 >>操作符:

#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;
}

测试一下:

#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 }
}

请随意添加超出范围的检查。我希望这个例子可以帮助你:)

我做这个类的目的。它产生一个可变大小的矩阵(可扩展)当更多的项目添加

'''

#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;
};

'''