Sap*_*nee -2 c++ vector matrix
我正在尝试使用向量找出二维矩阵的转置。以下代码对我不起作用。我试图将矩阵传递到名为 transpose() 的函数中。我还可以采取哪些其他方法?如果您指出我的错误,我将不胜感激。
#include <iostream>
#include <vector>
using namespace std;
void transpose(vector<vector<int> > &b)
{
vector<vector<int> > trans_vec;
for(int i=0;i<b.size();i++)
{
for(int j=0;j<b[i].size();j++)
{
trans_vec[j][i]=b[i][j];
}
}
}
int main()
{
vector<vector<int> > v1;
for(int i=0;i<2;i++)
{
vector<int> temp;
for(int j=0;j<3;j++)
{
temp.push_back(i);
}
v1.push_back(temp);
}
//Display output
for(int i=0;i<v1.size();i++)
{
for(int j=0;j<v1[i].size();j++)
{
cout<<v1[i][j];
}
cout<<endl;
}
transpose(v1);
//display transposed matrix
for(int i=0;i<v1.size();i++)
{
for(int j=0;j<v1[i].size();j++)
{
cout<<v1[i][j];
}
cout<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您将保持传入的参数不变。这就是为什么你看不到任何变化。此外,您正在访问无效索引,因此请使用正确的大小初始化向量。尝试这个:
void transpose(vector<vector<int> > &b)
{
if (b.size() == 0)
return;
vector<vector<int> > trans_vec(b[0].size(), vector<int>());
for (int i = 0; i < b.size(); i++)
{
for (int j = 0; j < b[i].size(); j++)
{
trans_vec[j].push_back(b[i][j]);
}
}
b = trans_vec; // <--- reassign here
}
Run Code Online (Sandbox Code Playgroud)
这将第一行中的向量初始化为正确的大小。当然,这只适用于 b[0].size() == b[1].size() == ... == b[n].size()。
如果你不想使用push_back,你可以这样写:
for (int j = 0; j < b[i].size(); j++)
{
if (trans_vec[j].size() != b.size())
trans_vec[j].resize(b.size());
trans_vec[j][i] = b[i][j];
}
Run Code Online (Sandbox Code Playgroud)
返回结果的另一种方法是在函数末尾返回 trans_vec 并传入 b 作为 const 引用:
vector<vector<int> > transpose(const vector<vector<int> > &b)
{
...
return trans_vec;
}
Run Code Online (Sandbox Code Playgroud)