读取文件并将其存储在 unordered_map 中时出现问题

Problem reading file and storing it in unordered_map

我正在尝试读取文件并将其内容存储到 unordered_map 中,但我遇到了一个小问题。这是我的 unordered_map:

std::unordered_map<std::string, std::vector<double>> _users;

这是我正在尝试读取的文件的内容:

Mike 4 NA 8 NA NA
Lena NA 8 4 NA 9

我想将内容存储在 _users 中,键是名称,在向量中我们有与名称关联的数字。此外,我希望 NA 等于 0。 所以我设法做到了:

while ( std::getline(file, line))
    {
        std::istringstream iss(line);
        std::string key;
        double value;
        iss >> key;
        dict[key] = std::vector<double>();

        while (iss >> value)
        {
            dict[key].push_back(value);
        }
    }

但是由于 valuedouble,当检查 NA 时它只是停止 while 循环,我只是得到,例如 Mike:Mike 4。我该怎么做才能让它读取 NA 并将其作为 0 放入 vector 中?感谢您的帮助!

对于你的内部循环,你可以这样做:

    std::string stringval;
    while (iss >> stringval)
    {
        double value;
        try
        {
            value = std::stod (stringval);
        }
        catch (...)
        {
            value = 0.0;
        }
        dict[key].push_back(value);
    }

我也试过:

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <fstream>
#include <sstream>

int main(int argc, char*[])
{
        //1. Read the file and load the map
        std::unordered_map<std::string, std::vector<double>> users{};

        std::ifstream file{"file.txt"};
        std::string line{};

        while(std::getline(file, line))
        {
                std::istringstream iss(line);
                std::string key{};
                iss >> key;

                std::vector<double> values{};

                while(iss)
                {
                        double value{0};
                        if (iss.str() != "NA")
                                iss >> value;
                        values.push_back(value);
                }

                users.insert({key, values});
        }

        //2. Printing the map
        for(auto const &[key, values]: users)
        {
                std::cout << "Key: " << key << std::endl;
                for(auto const value: values)
                {
                        std::cout << value << " ";
                }
                std::cout << std::endl;
        }

        return EXIT_SUCCESS;
}