在 C++ 中,c++,dictionary,printing,iterator"/>

首页 > 解决方案 > 从地图打印的问题在 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;
   }
}

标签: c++dictionaryprintingiterator

解决方案


您的实现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]));
}

您不需要使用atwith,tram因为如果条目不存在,您想创建它。at如果 中的元素少于三个, withtram_data将导致抛出异常tram_data,因此检查已移到对向量的所有访问之外。


推荐阅读