c++ - C++ 和 oops 中的多组
问题描述
从 person 类开始,创建一个 multiset 来保存指向 person 对象的指针。使用 comparePersons 函数对象定义多重集,因此它将按人名自动排序。定义六个人,将他们放入多重集中,并显示其内容。几个人应该有相同的名字,以验证多重集存储具有相同键的多个对象。
问题:我无法对多重集进行排序,我不知道为什么。
代码://对指针存储的人对象进行排序
#include <iostream>
#include <algorithm>
#include <string>
#include <set> //addded---------------------------------------------
using namespace std;
class person
{
private:
string lastName;
string firstName;
long phoneNumber;
public:
// default constructor
person() :lastName("blank"), firstName("blank"), phoneNumber(0L)
{ }
// 3-arg constructor
person(string lana, string fina, long pho) :
lastName(lana), firstName(fina), phoneNumber(pho)
{ }
friend bool operator<(const person&, const person&);
friend bool operator==(const person&, const person&);
void display() const // display person's data
{
cout << endl << lastName << ",\t" << firstName
<< "\t\tPhone: " << phoneNumber;
}
long get_phone() const // return phone number
{
return phoneNumber;
}
}; //end class person
//--------------------------------------------------------------
// overloaded < for person class
bool operator<(const person& p1, const person& p2)
{
if (p1.lastName == p2.lastName)
return (p1.firstName < p2.firstName) ? true : false;
return (p1.lastName < p2.lastName) ? true : false;
}
//--------------------------------------------------------------
// overloaded == for person class
bool operator==(const person& p1, const person& p2)
{
return (p1.lastName == p2.lastName &&
p1.firstName == p2.firstName) ? true : false;
}
//--------------------------------------------------------------
// function object to compare persons using pointers
class comparePersons
{
public:
bool operator() (const person* ptrP1, const person* ptrP2) const
{
return *ptrP1 < *ptrP2;
}
};
//--------------------------------------------------------------
//function object to display a person, using a pointer
class displayPerson
{
public:
void operator() (const person* ptrP) const
{
ptrP->display();
}
};
////////////////////////////////////////////////////////////////
int main()
{
//make persons
person* ptrP1 = new person("KuangThu", "Bruce", 4157300);
person* ptrP2 = new person("Deauville", "William", 8435150);
person* ptrP3 = new person("Wellington", "John", 9207404);
person* ptrP4 = new person("Bartoski", "Peter", 6946473);
person* ptrP5 = new person("Fredericks", "Roger", 7049982);
person* ptrP6 = new person("McDonald", "Stacey", 7764987);
person* ptrP7 = new person("KuangThu", "Bruce", 4157300);
person* ptrP8 = new person("Deauville", "William", 8435150);
//Creating multiset
multiset<person*> multiPtrsPers;
multiPtrsPers.insert(ptrP1);
multiPtrsPers.insert(ptrP2);
multiPtrsPers.insert(ptrP3);
multiPtrsPers.insert(ptrP4);
multiPtrsPers.insert(ptrP5);
multiPtrsPers.insert(ptrP6);
multiPtrsPers.insert(ptrP7);
multiPtrsPers.insert(ptrP8);
for_each(multiPtrsPers.begin(),multiPtrsPers.end(), displayPerson());//display person
cout << endl;
sort(multiPtrsPers.begin(), multiPtrsPers.end(), comparePersons());//compare persons
for_each(multiPtrsPers.begin(), multiPtrsPers.end(), displayPerson());//display persons
cout << endl;
system("pause");
return 0;
} end main()
解决方案
您的比较器应该采用多集类型:
multiset<person*, comparePersons> multiPtrsPers;
(multi)set 之后不能通过其他比较重新排序。
您不能调用sort
该容器。
推荐阅读
- css - 如何使用 css 更改 Microsoft Edge 中的默认打印设置
- angular - 订阅方法未触发
- python - 制表符完成器使用什么分隔符
- javascript - 将整行保存到数组中
- sql - INSERT INTO 方法不起作用
- html - 在我的网站导航栏中,可点击的部分比我想要的要多。他们为什么在那里?
- javascript - 如何将 DateTime 字符串格式转换为其他 DateTime?
- logging - Serilog:如何在浓缩器中记录对象?
- java - Spring 集成:Dispatcher 没有频道订阅者
- python - 如何在 python 中使用多个进程来实现连续工作负载