是否可以在C ++中使用具有不同行大小的矩阵?

时间:2017-03-08 10:08:01

标签: c++ matrix

我需要从文件中读取一些内容。 第一个int表示我将在该行中有多少个整数。

示例:

5 1 4 7 10 2
4 5 6 7 1
3 1 0 8
3 4 5 6
4 1 2 3 4

有没有办法创建这样的矩阵?

我看到有一种做类似事情的方法,但不是矩阵: Is it possible to make a matrix with rows that have different #rows on Matlab?

4 个答案:

答案 0 :(得分:4)

你想要一个锯齿状边缘矩阵。

在数学建模中,这通常是最不受欢迎的事情,但在您的特定案例中,

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

将完美地模拟这一点。请注意int的属性因平台而异。 int可以采用的最小范围是-32767到+ 32767.考虑使用long&amp; c。如果有必要的话。

答案 1 :(得分:2)

在C ++中不可能有具有不同行大小的二维数组(如果这是矩阵的意思)。 您可以使用一些C ++ std库容器或一些解决方法来克服此限制。一些选项是:

  • 指针数组,其中每个指针指向所需大小的数组(通常是动态分配的)。
  • std::vector或其他容器的数组。或std::vectorstd::arraystd::vector的其他容器。 (例如:std::vector< std::vector< T > >
  • 最大行大小的二维数组。

在所有上述方法中,行的数据是连续的。要使数据连续(如果需要),您可以创建一个自己的类,它创建一个大的1-d数组并将其模拟为2-d数组。

答案 2 :(得分:0)

矩阵的定义是矩形的。所以,你所描述的不是一个矩阵。这是一个锯齿状的阵列。

您不能拥有子阵列大小不同的数组数组。数组的所有元素必须具有相同的类型。但是你可以有一个指针数组,它可以指向任何大小的数组。最简单的解决方案是使用std::vector

std::vector<std::vector<int>> vec_of_vecs;

这实际上是表示二维数组结构(锯齿状或非锯齿状)的最简单方法,尽管内存表示并不像您对非锯齿状2D数组所期望的那样连续。

为了提高性能,也可以将数组存储在单个内存块中,但这样会复杂得多。你可以做的是分配一个包含所有行的内存块,另一个数组来存储指向每行开头的指针。

答案 3 :(得分:0)

可以使用std::vector<std::vector<int> >类型的元素创建std::vectorstd::vector<int>

个人std::vector<int>可以有不同的大小。