【问题标题】:ostream operator overload for struct with map带有映射的结构的ostream运算符重载
【发布时间】:2015-09-27 10:11:48
【问题描述】:

我为学生创建了一个等级结构,并试图重载“

// Sample output:
a12345678
2             //number of elements in map
COMP3512 87  
COMP3760 68

struct Grades {
  string             id;       // student ID, e.g,, a12345678
  map<string, int> scores;     // course, score, e.g. COMP3512, 86
};

我之前已经重载operator&lt;&lt;独立获取信息。

ostream& operator<<(ostream& os, const Grades g) { 
  return os << g.id << '\n' ... 

  // return os << g.id << '\n' << g.scores;   produces an error
}

我怀疑这与重载没有正确的映射语法有关,如下所示。

ostream& operator<<(ostream& os, const map<string, int>& s) {
  for (auto it = s.begin(); it != s.end(); ++it) 
    os << (*it).first << ' ' << (*it).second << endl;

  return os;
}

有没有办法通过一个重载产生示例输出,或者我需要两个当前的实现:一个用于地图:grades.scores,另一个用于字符串:grades.id

感谢您的帮助。

【问题讨论】:

  • 这个问题还不清楚。将您显示的地图输出放入Grades&lt;&lt; 运算符中几乎可以满足您的需求。 &gt;&gt; 不应该产生输出。你到底在问什么?
  • @Angew 那是我的错,让我试着编辑一下。

标签: c++11 dictionary operator-overloading ostream istream


【解决方案1】:

您无法自己解决问题似乎很奇怪,因为如果我正确理解了这个问题,您只需将两个重载合并为一个,这样您就可以从 const Grades g 迭代 map,如下所示:

#include <iostream>
#include <map>
#include <string>

using namespace std;

struct Grades {
    string             id;       // student ID, e.g,, a12345678
    map<string, int> scores;     // course, score, e.g. COMP3512, 86
};


ostream& operator<<(ostream& os, const Grades g) { 
    os << g.id << endl << g.scores.size() << endl;
    for (auto it = g.scores.begin(); it != g.scores.end(); ++it) 
        os << (*it).first << ' ' << (*it).second << endl;
    return os;
}

int main(int argc, char** argv)
{
    Grades g;
    g.id = "a12345678";
    g.scores["COMP3512"] = 87;
    g.scores["COMP3760 "] = 68;
    cout << g;
    return 0;
}

【讨论】:

    【解决方案2】:

    没有为std::map提供标准的&lt;&lt;,所以你必须自己输出。但是没有什么能阻止你将你的实现连接到一个函数中:

    std::ostream& operator<< (std::ostream &os, const Grades &g)
    {
      os << g.id << '\n';
      os << g.scores.size() << '\n';
      for (const auto &s : g.scores) {
        os << s.first << ' ' << s.second << '\n';
      }
      return os;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2021-02-20
      • 2016-07-28
      • 2020-11-08
      • 1970-01-01
      • 2010-09-13
      • 2013-10-10
      • 1970-01-01
      相关资源
      最近更新 更多