Просмотрите матрицу строк и сохраните ее в векторе vector - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть эта матрица в строке:

-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;
}

Я бы хотел самое простое решение, чтобы сохранить его, даже если оно находится во вкладке с плавающей точкой.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Проблема в том, что ваш второй цикл while ((l_position = line.find(space)) != std::string::npos) пропускает последнюю запись, поскольку не находит пробел.Чтобы это исправить, вы можете использовать другой поток строк.Вам также нужно вывести ваш vector<float> перед внутренним циклом 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);
}
0 голосов
/ 25 сентября 2018

Вы можете значительно упростить код (и исправить его одновременно), используя стандартные операции и функции 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>());
}

См., Например, здесь для рабочего примераи как печатать каждый элемент

...