【问题标题】:Browse a string matrix and store it in a vector of vector浏览字符串矩阵并将其存储在向量的向量中
【发布时间】:2018-09-25 13:16:27
【问题描述】:

我在一个字符串中有这个矩阵:

-78.45 5120 45.369 7.456
-0.140 1.012 1.161 7.456
-4.4287 8.963 1.121 7898
-8.753 8.159 3.852 2.415
0.000 2.456 4.655 6.041
0.000 3.132 8.275 1.788
7.489 8.056 7.288 5.698
4.050 7.456 7.340 2.025
0.090 9.478 9.395 6.416
1.132 6.866 8.450 2.126
6.222 5.142 7.596 0.56
9.121 2.256 5.641 3.741
8.896 1.488 2.858 2.456

我想浏览它并将其存储在矩阵向量或浮点矩阵中。 我实际上可以将它存储在一个向量中,这是功能代码:

int main()
{
    std::istringstream str(
        "-78.45 5120 45.369 7.456\n"
        "-0.140 1.012 1.161 7.456\n"
        "-4.4287 8.963 1.121 7898\n"
        "-8.753 8.159 3.852 2.415\n"
        "0.000 2.456 4.655 6.041\n"
        "0.000 3.132 8.275 1.788\n"
        "7.489 8.056 7.288 5.698\n"
        "4.050 7.456 7.340 2.025\n"
        "0.090 9.478 9.395 6.416\n"
        "1.132 6.866 8.450 2.126\n"
        "6.222 5.142 7.596 0.56\n"
        "9.121 2.256 5.641 3.741\n"
        "8.896 1.488 2.858 2.456\n");

    std::string space = " ";
    std::string line;
    size_t l_position = 0;
    std::vector<float> vectorNumber;
    while (std::getline(str, line)) {
        while ((l_position = line.find(space)) != std::string::npos)
        {
            float nombre = std::stof(line.substr(0, l_position));
            vectorNumber.push_back(nombre);
            line.erase(0, l_position + space.length());
        }
        vectorNumber.push_back(std::stof(line));
    }

    int w = 0;
    for(vector<float>::iterator it=vectorNumber.begin(); it!=vectorNumber.end(); ++it)
    {
        cout << *it << " ";
        w++;
        if (w==4){
            cout << endl;
            w = 0;
        }
    }

    return 0;
}

当我尝试将它存储在向量的向量中时,每行的最后一个数字块被删除,我不知道为什么。我快疯了,你能帮帮我吗?

这是我的代码:

int main()
{
    std::istringstream str(
        "-78.45 5120 45.369 7.456\n"
        "-0.140 1.012 1.161 7.456\n"
        "-4.4287 8.963 1.121 7898\n"
        "-8.753 8.159 3.852 2.415\n"
        "0.000 2.456 4.655 6.041\n"
        "0.000 3.132 8.275 1.788\n"
        "7.489 8.056 7.288 5.698\n"
        "4.050 7.456 7.340 2.025\n"
        "0.090 9.478 9.395 6.416\n"
        "1.132 6.866 8.450 2.126\n"
        "6.222 5.142 7.596 0.56\n"
        "9.121 2.256 5.641 3.741\n"
        "8.896 1.488 2.858 2.456\n");

    std::string space = " ";
    std::string line;
    size_t l_position = 0;
    std::vector<float> vectorNumber;
    std::vector<vector<float>> vectorOfVectorNumber;
    while (std::getline(str, line)) {
        while ((l_position = line.find(space)) != std::string::npos)
        {
            float nombre = std::stof(line.substr(0, l_position));
            vectorNumber.push_back(nombre);
            line.erase(0, l_position + space.length());
        }
        vectorOfVectorNumber.push_back(vectorNumber);
    }
    int w = 0;
    for (int i = 0; i < vectorOfVectorNumber.size(); i++)
    {
        for (int j = 0; j < vectorOfVectorNumber[i].size(); j++)
        {
            cout << vectorOfVectorNumber[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

我想要最简单的解决方案来存储它,即使它在选项卡的浮动选项卡中。

【问题讨论】:

  • 你错过了最后一个,因为你搜索了一个空格,但是你的行尾没有空格,只有\n。我建议您不要手动执行此操作,而是从您的行字符串创建一个字符串流,然后从中读取数字。
  • 请注意,不仅平面向量更易于阅读,它实际上是存储矩阵的最有效方式(只要矩阵是密集的。其他表示更适合备用矩阵) ,因此可能值得考虑继续使用工作代码。

标签: c++ string parsing matrix vector


【解决方案1】:

您可以通过使用标准 C++ 操作和函数大大简化代码(并同时修复它):

std::istringstream str(
"-78.45 5120 45.369 7.456\n"
"-0.140 1.012 1.161 7.456\n"
"-4.4287 8.963 1.121 7898\n"
"-8.753 8.159 3.852 2.415\n"
"0.000 2.456 4.655 6.041\n"
"0.000 3.132 8.275 1.788\n"
"7.489 8.056 7.288 5.698\n"
"4.050 7.456 7.340 2.025\n"
"0.090 9.478 9.395 6.416\n"
"1.132 6.866 8.450 2.126\n"
"6.222 5.142 7.596 0.56\n"
"9.121 2.256 5.641 3.741\n"
"8.896 1.488 2.858 2.456\n");

std::vector<std::vector<float>> matrix;

std::string line;
while (std::getline(str, line))
{
    std::istringstream iss(line);
    matrix.emplace_back(std::istream_iterator<float>(iss), std::istream_iterator<float>());
}

参见例如here 一个工作示例以及如何打印每个元素

【讨论】:

    【解决方案2】:

    问题是您的第二个循环while ((l_position = line.find(space)) != std::string::npos) 这会跳过最后一个条目,因为它找不到空格。要解决此问题,您可以使用另一个字符串流。您还需要将您的vector&lt;float&gt; 放在内部while循环之前,整个事情看起来像这样:

    while (std::getline(str, line)) {
    
        stringstream ss(line);
        string number = "";
        std::vector<float> vectorNumber;
        while (std::getline(ss,number,' '))
        {
            vectorNumber.push_back(stof(number));
        }
        vectorOfVectorNumber.push_back(vectorNumber);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多