C ++中的维动态数组

时间:2012-06-06 12:11:39

标签: c++ visual-studio-2010

我只用了15天的时间用c ++编写代码,我遇到了一些困难的问题。我需要使用动态二维数组来满足我的目的。我使用std :: vector来创建一维动态数组,我不知道如何创建二维动态数组。我正在使用VC ++,如果它有帮助,但我没有VC ++库函数。

有谁知道如何完成它?

6 个答案:

答案 0 :(得分:3)

您可以使用嵌套向量:

int number_of_rows, number_of_columns;

std::vector < std::vector <int> > array;

array.resize(number_of_rows);

for (int i=0; i < number_of_rows; ++i)
    array[i].resize(number_of_columns);

array[1][2] = 3; // e.g. of assignment

在构造函数中初始化完整的数组大小:

std::vector <std::vector <int> > (nor, std::vector<int>(noc));

但请注意,嵌套的std::vector结构不会将您绑定到二维数组 - 每个嵌套向量都可以具有不同的大小。 E.g:

std::vector <std::vector <int> > not_array(3); 
    // contains 3 inner empty vectors
for (int i=0; i < 3; ++i)
    arrray[i].resize(i+1);

现在not_array按顺序包含大小 1,2和3 的向量。

如果你想确定使用矩阵(2D),而不仅仅是(1D)向量的向量,你可以使用外部库中的实现。

答案 1 :(得分:1)

如果您的数组维度可以变量(例如,每行可以有不同的长度),vector<vector<int> >是一个很好的解决方案(用您的特定元素类型替换int)。

即使每行的长度相同,您也可以使用此方法,但确保此属性可能更有效。在后一种情况下,您最好找一个支持某种Matrix类型的库。

答案 2 :(得分:1)

C ++ / STL标准库中没有二维数据结构。

正如其他人所说,你可以通过嵌套STL容器来实现这一目的,例如vector。但是它不能保证整体结构的一致性。 (矩阵的两行不能保证长度相同)。

您应该将其封装在对象中以强制执行正确的矩阵结构。或者您可以使用现有的Matrix数据结构,我确信有很多库提供它。

答案 3 :(得分:0)

二维数组是向量的向量。请参阅example

// Declare size of two dimensional array and initialize.
vector< vector<int> > vI2Matrix(3, vector<int>(2,0));   
vI2Matrix[0][0] = 0;
vI2Matrix[0][1] = 1;
vI2Matrix[1][0] = 10;
vI2Matrix[1][1] = 11;
vI2Matrix[2][0] = 20;
vI2Matrix[2][1] = 21;
cout << "Loop by index:" << endl;

int ii, jj;
for(ii=0; ii < 3; ii++)
{
  for(jj=0; jj < 2; jj++)
  {
     cout << vI2Matrix[ii][jj] << endl;
  }
}

答案 4 :(得分:0)

如果您正在处理标量数组,那么您一定要考虑使用Eigen

  

Eigen是线性代数的C ++模板库:矩阵,向量,   数值求解器和相关算法。

它带有一个很棒的documentation,它提供了许多例子。

在Eigen上调整数组大小非常简单:

#include <Eigen/Dense>
using namespace Eigen;
...
MatrixXd m(5,5);  // 5x5 matrix of double
m.resize(10,5);   // resizing to a 10x5 matrix

请注意,Eigen也是extensible to custom scalar types

答案 5 :(得分:-1)

std::vector< std::vector<int> >

<强>后

扩展std :: vector非常简单但减少了一些问题。请参阅refs

当你缩小尺寸时,你只是在逻辑上删除额外的元素(不保证物理上减少内存)。要强制减少记忆,您可以使用trick