我想将一个矩阵从一个文件加载到一个多维向量 - 文件内容是:
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
我知道如何使用向量并逐行读取文件中的单个字符...但我真的不知道如何制作多维向量并从文件中的每一行读取几个数字...我该怎么做?
我想将一个矩阵从一个文件加载到一个多维向量 - 文件内容是:
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
我知道如何使用向量并逐行读取文件中的单个字符...但我真的不知道如何制作多维向量并从文件中的每一行读取几个数字...我该怎么做?
我想您可以创建一个整数向量的向量,例如vector<vector<int>>
您可以将一行读取为字符串,然后您可以将其按空格拆分并加载到第一个向量中。然后你把你的内部向量推到外部。
如果所有行都一样长(因为它是一个矩阵),我建议您编写一个自定义类Matrix
而不是使用 a 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
,不是吗?)。
在内部,您可以使用 anint[][]
或 anstd::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
使用适当的大小进行初始化(至少如果您使用数组,如果您使用向量,您可能会跳过它)
可能这个解决方案听起来要复杂得多(是的,它确实需要更多的时间来实现),但最后,如果你想编写一个易于维护的程序并希望使用多个Matrix
实例,这肯定是要走的路。请注意,这只是一个建议,界面当然可以看起来不同。