c++ - 从地图打印的问题在 C++ 中
问题描述
我正在学习 C++。这是我的问题:我正在尝试从文本文件中读取数据并将其保存到 map<string, struct> 然后让它打印出地图中的所有键,最好按字母顺序。数据有 2 个字符串和一个浮点数。即使尝试了许多不同的解决方案,我也无法将其打印出来。这是我到目前为止所得到的:
这是我的结构:
struct category
{
std::string tram_stop;
float dist;
};
using Tram = std::map<std::string, std::vector<category>>;
这是我尝试将数据保存到地图的地方。
void store(Tram& tram, std::vector<std::string>& tram_data)
{
if (tram.find (tram_data.at (0)) == tram.end ())
{
tram[tram_data.at (0)] = {};
}
else
{
tram.at (tram_data.at (0)).push_back (category {tram_data.at (1), std::stof(tram_data.at(2))});
}
}
这里是 main()。
int main()
{
Tram tram;
print_rasse();
// Ask input filename.
std::string filename;
std::cout << "Give a name for input file: ";
std::cin >> filename;
// Read input file.
std::ifstream file_in;
file_in.open (filename);
if (!file_in.is_open ())
{
std::cout << INVALID_FILE << std::endl;
return EXIT_FAILURE;
}
std::vector<std::string> tram_data;
if (file_in.is_open())
{
std::string line;
while( std::getline(file_in,line) )
{
std::stringstream ss(line);
std::string tram_line, tram_stop, distance;
std::getline(ss,tram_line,';'); //std::cout<< ""<<tram_line <<" ";
std::getline(ss,tram_stop,';'); //std::cout<<" "<<tram_stop<<" ";
std::getline(ss,distance); //std::cout<<" "<<distance<< " ";
if (tram_line != "" && tram_stop != "")
{
tram_data.push_back (tram_line);
tram_data.push_back (tram_stop);
tram_data.push_back (distance);
//std::cout << tram_line << " " << distance << std::endl;
}
else
{
std::cout << INVALID_FORMAT << std::endl;
return EXIT_FAILURE;
}
}
file_in.close ();
store(tram, tram_data);
}
这是我认为不起作用的部分。也尝试了不同的迭代器。
if (upper_com == "LINES")
{
std::cout << "All tramlines in alphabetical order:" << std::endl;
for (auto& item : tram)
{
std::cout << item.first << std::endl;
}
}
解决方案
您的实现store
将为为特定tram_data[0]
值添加的第一个项目创建一个向量,但不会向向量添加任何内容。这会导致丢失第一个项目,并且可能由于空向量而导致没有输出。
该功能可以简化:
void store(Tram& tram, std::vector<std::string>& tram_data)
{
if (tram_data.size() < 3) throw std::out_of_range();
tram[tram_data[0]].emplace_back(tram_data[1], std::stof(tram_data[2]));
}
您不需要使用at
with,tram
因为如果条目不存在,您想创建它。at
如果 中的元素少于三个, withtram_data
将导致抛出异常tram_data
,因此检查已移到对向量的所有访问之外。
推荐阅读
- c++ - 动态数组是否在内存中连续分配?
- python - 为什么错误,无法打印按钮消息框?
- javascript - 在 discord.js 上使用 8ball 命令时遇到问题
- c++ - 计算已排序文本文件 C++ 中的重复次数
- azure - 如何在 Azure 函数输出绑定中禁用 Blob 存在检查
- excel - 使用宏保存 Excel 工作簿时日期反转
- python - 如果列表目录提到 __count__ 和 __len___ 为什么使用这两个运算符的语法不同?
- javascript - html5画布上两条贝塞尔曲线下的填充区域
- xcode - SwiftUI 隐藏状态栏
- python - RelatedObjectDoesNotExist at /register/ 用户没有 schoolprofile