如何创建2D矢量?我知道在2D数组中,我可以表达它:
a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
如何使用C ++ STL Vector做到这一点?
答案 0 :(得分:32)
vector<vector<int> > a;
如果要定义行和列,
vector<vector<int> > a{{11, 2, 4}, {4, 5, 6}, {10, 8, -12}};
答案 1 :(得分:30)
std::vector< std::vector< int > > a; // as Ari pointed
将此用于增长矩阵可能会变得复杂,因为系统不能保证所有内部向量都具有相同的大小。每当你在第二维度上成长时,你必须明确地增长所有向量。
// grow twice in the first dimension
a.push_back( vector<int>() );
a.push_back( vector<int>() );
a[0].push_back( 5 ); // a[0].size() == 1, a[1].size()==0
如果你没事(它不是一个矩阵而是一个矢量矢量),你应该没问题。否则,您需要特别注意保持第二维在所有向量中保持稳定。
如果您正在计划固定大小的矩阵,那么您应该考虑封装在类中并重写operator()而不是提供双数组语法。阅读有关此here
的C ++常见问题解答答案 2 :(得分:13)
std::vector< std::vector<int> > a;
//m * n is the size of the matrix
int m = 2, n = 4;
//Grow rows by m
a.resize(m);
for(int i = 0 ; i < m ; ++i)
{
//Grow Columns by n
a[i].resize(n);
}
//Now you have matrix m*n with default values
//you can use the Matrix, now
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
//OR
for(i = 0 ; i < m ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{ //modify matrix
int x = a[i][j];
}
}
答案 3 :(得分:6)
如果您没有 使用向量,则可能需要尝试Boost.Multi_array。这是一个简短的例子link。
答案 4 :(得分:1)
声明一个矩阵,例如,具有5行3列:
vector<vector<int> > new_matrix(5,vector<int>(3));
获得与上述结果相同的另一种声明方式:
vector<int> Row;
矩阵的一行:
vector<Row> My_matrix;
My_matrix是行向量:
My_matrix new_matrix(5,Row(3));
答案 5 :(得分:0)
dribeas的建议真的是要走的路。
为了给出你可能想要运行operator()路由的原因,考虑一下,例如,如果你的数据稀疏,你可以用不同的方式进行布局,以便在内部节省空间,而operator()会隐藏你的内部实现问题最终用户为您提供更好的封装,并允许您在不破坏界面的情况下节省空间或提高内部布局的更改速度。
答案 6 :(得分:0)
正如Ari指出的,vector< vector< int>>
是正确的做法。
除此之外,在这种情况下,我总是考虑在一个类中包装内部向量(实际上,无论它代表什么),因为复杂的STL结构往往变得笨拙和混乱。
答案 7 :(得分:0)
只需使用以下方法即可使用二维矢量。
int rows, columns; // . . . vector < vector < int > > Matrix(rows, vector< int >(columns,0)); Or vector < vector < int > > Matrix; Matrix.assign(rows, vector < int >(columns, 0)); // Do your stuff here...
这将创建一个大小行*列的矩阵并用零初始化它,因为我们在构造函数中传递零(0)作为第二个参数,即vector&lt; int&gt; (列,0)。