C++ 读取文件并将其存储在无序映射中时出现问题
我正试图读取一个文件并将其内容存储到一个C++ 读取文件并将其存储在无序映射中时出现问题,c++,unordered-map,istringstream,C++,Unordered Map,Istringstream,我正试图读取一个文件并将其内容存储到一个无序的\u映射中,但我遇到了一个小问题。这是我的无序地图: std::unordered_map<std::string, std::vector<double>> _users; 我想在\u users中存储内容,这样键就是名称,在向量中我们有与名称相关的数字。此外,我希望NA等于0。 所以我设法做到了: while ( std::getline(file, line)) { std::istringst
无序的\u映射中
,但我遇到了一个小问题。这是我的无序地图
:
std::unordered_map<std::string, std::vector<double>> _users;
我想在\u 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);
}
}
while(std::getline(文件,行))
{
标准::istringstream iss(线);
std::字符串键;
双重价值;
iss>>键;
dict[key]=std::vector();
而(iss>>值)
{
dict[key]。推回(值);
}
}
但是由于
值
是一个双精度
,当检查NA
时,它只会停止while循环,我只会得到,例如Mike:Mike 4
。如何才能让它读取NA
,并将其作为向量中的0?谢谢你的帮助 对于内部循环,您可以执行以下操作:
std::string stringval;
while (iss >> stringval)
{
double value;
try
{
value = std::stod (stringval);
}
catch (...)
{
value = 0.0;
}
dict[key].push_back(value);
}
我还尝试了一些东西:
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*[])
{
//1.读取文件并加载地图
std::无序的_映射用户{};
std::ifstream文件{“file.txt”};
std::字符串行{};
while(std::getline(文件,行))
{
标准::istringstream iss(线);
std::字符串键{};
iss>>键;
std::向量值{};
while(国际空间站)
{
双值{0};
如果(iss.str()!=“NA”)
iss>>价值;
值。推回(值);
}
insert({key,values});
}
//2.打印地图
对于(自动常量和[键,值]:用户)
{
std::cout显示的代码已经证明您知道执行此操作所需的一切。与其使用>
将每个单词提取为双精度
,不如将其提取为std::string
,检查是否为“NA”,否则构造一个std::istringstream
,并使用它提取>
双值。任务完成。这是否总是一行6列?如果(iss.str()!=“NA”)
测试有缺陷,因为您没有提取像“NA”这样的空格分隔的std::string
标记与之比较:相反,您是在与整个std::istringstream
内容进行比较。值得一提的是,这种方法的缺点是,输入中出现的任何其他垃圾都将被悄悄地替换为0。@TonyDelroy是的,您当然可以使其更复杂。我希望保持简单。
std::string stringval;
while (iss >> stringval)
{
double value;
try
{
value = std::stod (stringval);
}
catch (...)
{
value = 0.0;
}
dict[key].push_back(value);
}