将矩阵从文件加载到向量中

时间:2013-06-14 21:16:04

标签: c++

我想将文件中的矩阵加载到多维数据向量 - 文件内容为:

0 0 1 1 1 0
1 0 1 0 0 1
0 1 0 1 1 0
0 0 0 0 0 1
1 1 0 0 1 0
1 0 0 1 0 0

我知道如何使用向量并逐行读取文件中的单个字符...但我真的不知道如何制作多维向量并从文件中的每一行读取几个数字......我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

我想你可以创建一个像vector<vector<int>>这样的整数向量的向量 您可以将一行读作字符串,然后可以按空格拆分并加载到第一个矢量中。然后你将内部矢量推入外部。

以下是way how to do this

答案 1 :(得分:0)

如果所有行都是等长的(因为它是一个矩阵右边),我建议你编写一个自定义类Matrix,而不是使用vector<vector<int>>(这肯定有效)

这样的类可以暴露出如下界面:

int getWidth()
int getHeight()
int get(int x, int y)
void set(int x, int y, int value)

人们可以想到其他功能(如乘法等)以及更难以访问和存储的功能。 (Matrix m_matrix;看起来比std::vector<std::vector<int>> m_matrix好,不是吗?)。

在内部,您可以使用int[][]std::vector<std::vector<int>>,具体取决于您的喜好,以存储实际数据。

另请注意,这样的类也会强制执行矩阵可以具有的限制,例如在我的第一句中提到的同样长的行。

要实际反序列化此字符串,抽象地说,您必须迭代遍历计数器的每一行,然后遍历每个递增另一个计数器的数字。 然后,在每次迭代中,您都会调用myMatrix.set(x,y,parsedValue);

然后可能的实现可能如下所示:

std::string line;
int x = 0;
int y = 0;
int value;
while ( getline( std::cin, line ) ) {
    std::istringstream is( line );

    while(!is.eof()) {
        is >> value;
        myMatrix.set(x,y,value)
        x++
    }
    y++
}

请注意,您首先必须使用适当的大小初始化myMatrix(至少如果您使用数组,如果您使用的向量,则可以跳过它)

可能这个解决方案听起来有点复杂(是的,确实需要花费更多的时间来实现),但最后,如果你想编写一个易于维护的程序并希望使用多个{{1}实例,这肯定是要走的路。请注意,这只是一个建议,界面当然可以看起来不同。