【发布时间】:2019-01-28 17:04:09
【问题描述】:
当我打印整套时,结果是未排序的并且它包含一个副本。
对象Person 有一个姓氏、一个姓氏和出生年份(这三个都是字符串)。我首先按出生年份排序,然后按姓氏,然后按姓氏。本质上,没有相同的人(但即使是这种情况,也应该在他们插入set 时将其删除)。
更具体地说,我创建了一组这样的人:
std::set <Person> greatUncles;
并像这样插入它们:
greatUncles.insert(Person("bla", "bla", "1900"));
这是Person 类的基本内容:
class Person {
public:
//...
Person(std::string s, std::string f, std::string y)
:surname(s), familyname(f), yearOfBirth(y)
{
}
//...
std::string getSurname() const {
return surname;
}
std::string getFamilyname() const {
return familyname;
}
std::string getYearOfBirth() const {
return yearOfBirth;
}
private:
std::string surname;
std::string familyname;
std::string yearOfBirth;
};
//to print the set, overload the '<<' operator
std::ostream &operator<<(std::ostream &o, const Person &person) {
o << person.getSurname() << " "
<< person.getFamilyname() << " "
<< person.getYearOfBirth() << std::endl;
return o;
}
//to order the set, overload the '<' operator
bool operator< (Person const &p1, Person const &p2) {
int compareYearOfBirth = p1.getYearOfBirth().compare(p2.getYearOfBirth());
if (compareYearOfBirth == 0) {
int compareFamilyname = p1.getFamilyname().compare(p2.getFamilyname());
if (compareFamilyname == 0) {
return p1.getSurname().compare(p2.getSurname());
} else
return compareFamilyname;
} else
return compareYearOfBirth;
}
这是我如何打印叔叔的集合:
void printGreatUncles(std::set <Person> &greatUncles) {
std::ofstream outputFile;
outputFile.open("greatuncle.dat");
if (outputFile.is_open()) {
for(Person const & person:greatUncles) {
outputFile << person;
}
outputFile.close();
}
}
现在某种情况下的输出应该是这样的(按年份排序):
Sebastian Furtweger 1942
Nikolaus Furtweger 1951
Archibald Furtweger 1967
但它看起来像这样:
Archibald Furtweger 1967
Sebastian Furtweger 1942
Nikolaus Furtweger 1951
Archibald Furtweger 1967
我一生都无法弄清楚我做错了什么(事情)。
【问题讨论】:
-
请不要把
...放在你的代码sn-p中,或者把它们放在cmets中,这会使你的代码无法直接复制/粘贴/运行。 -
感谢您的反馈,我会记住的。
标签: c++ c++11 object set overloading