将矩阵加载到 2D 向量 C++

Posted

技术标签:

【中文标题】将矩阵加载到 2D 向量 C++【英文标题】:Loading a Matrix into a 2D vector C++ 【发布时间】:2017-10-16 20:11:48 【问题描述】:

我是在 C++ 中使用向量的新手,我的目标是从文本文件中读取一个矩阵并将它们存储到一个二维向量中,我的代码如下:

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main()

    std::ifstream in("input.txt");
    std::vector<std::vector<int> > v;

    if (in) 
        std::string line;

        while (std::getline(in, line)) 
            v.push_back(std::vector<int>());

            // Break down the row into column values
            std::stringstream split(line);
            int value;

            while (split >> value)
                v.back().push_back(value);
        
    

    for (int i = 0; i < v.size(); i++) 
        for (int j = 0; j < v[i].size(); j++)
            std::cout << v[i][j] << ' ';

        std::cout << '\n';
    

现在输入说

10101010
01010101
10101011
01011010

我得到了

的输出
10101010
1010101
10101011
1011010

即,每次在行首遇到 0 时,都会将其省略。我认为问题出在语句 while(split>>value) 中,但我不知道如何以更好的方式对其进行编码。

【问题讨论】:

前导 0 对整数没有任何意义,因此它们被丢弃。为什么不只存储字符串? 我认为这是问题所在,因为 0 是逻辑错误,它被省略了,那么我该如何修复代码以包含它? 我逐个字符串地输入文件,因为它比逐个字符地读取它要快,但是我想稍后应用矩阵运算,所以我希望它们存储为整数。 你的意思是布尔值而不是int? 10101010,当读入 int 时,是单个整数值,而不是一系列整数值。 我尝试使用 boolean 作为我的向量类型,但是因为我不熟悉使用向量,所以我无法拆分字符串或遍历向量,因为我相信 boolean 逐位工作,而不是 int 以字节工作. 【参考方案1】:

似乎您实际上想要存储位,但不知何故难以将包含例如10101010 的行解析为一系列位。 如果您知道每行的最大位数,则可以使用bitset&lt;N&gt;,它为运算符&gt;&gt; 提供了一个易于使用的重载,可以直接读取10101010 之类的内容。希望对您有所帮助。

int main()

    std::ifstream in("input.txt");
    std::vector<std::bitset<8> >v;

    if (in) 
        std::bitset<8> bits;
        while (in >> bits) 
            v.push_back(bits);
        
    

    for (int i = 0; i < v.size(); i++) 
        for (int j = 0; j < v[i].size(); j++)
            std::cout << v[i][j] << ' ';

        std::cout << '\n';
    

【讨论】:

比我的答案要好得多【参考方案2】:

替换

while (split >> value)
    v.back().push_back(value);

for(int x=0; x<line.size(); x++)
    v.back().push_back((int)line[x] - (int)'0'));

并完全删除您的字符串流。

【讨论】:

你能解释一下代码中的' - (int)'0' ' 部分吗,谢谢它的工作 因此 ASCII 标准将数字按顺序定义为字符,从 0 到 9,因此将字符转换为 int 然后减去 0 的值即可得到字符的值。 不是很好的解释,但请看here

以上是关于将矩阵加载到 2D 向量 C++的主要内容,如果未能解决你的问题,请参考以下文章

在使用矩阵进行计算时擦除 C++ 2d 向量行

如何调整 2D C++ 向量的大小?

在 2D 向量上执行单行算术以找到简化的行形式 C++

犰狳中的矩阵(向量)在从文件加载后获得新的小数位

带有列的 C++ 文本文件到 2D 向量中

矩阵到向量 C++