具有map的struct的ostream运算符重载

时间:2015-07-09 07:20:18

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

我为学生创建了一个成绩结构,并试图重载'<<<运营商。

// 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<<以独立获取信息。

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;
}

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

<<没有提供标准std::map,因此您必须自行输出。但是没有什么可以阻止你在一个函数中连接你的实现:

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;
}

答案 1 :(得分:1)

您自己无法对其进行排序似乎很奇怪,因为如果我正确理解了这个问题,您只需要将两个重载合并为一个,这样就可以从{map进行迭代。 1}}像这样:

const Grades g