前言:這是我的一道作業題,爲了減少代碼量,我使用map進行數據保存,因爲課堂進度並未涉及STL,所以我使用map就顯得有些取巧
題目概述
main.cpp
#include <iostream>
#include "world.h"
using namespace std;
void test_1() {
person mike, jack, lily, carson, sucie;
group school(0), family_1(1), family_2(1);
// make group (act as a society)
school.addMember(mike);
school.addMember(jack);
school.addMember(lily);
family_1.addMember(mike);
family_1.addMember(carson);
family_2.addMember(jack);
family_2.addMember(lily);
family_2.addMember(sucie);
// construct relationship in the society
school.makeFriend(mike, jack);
school.makeFriend(mike, lily);
// display the society
cout << "\n------ SCHOOL -----\n";
school.displayGroup();
cout << "\n------ FAMILY_1 -----\n";
family_1.displayGroup();
cout << "\n------ FAMILY_2 -----\n";
family_2.displayGroup();
}
void test_2() {
person Baidu, Alibaba, Tencent, NTES, Kingsoft_Antivirus, _360safe;
group BAT(1), ECommerce(1), Security(1);
// make group (act as a society)
BAT.addMember(Baidu);
BAT.addMember(Alibaba);
BAT.addMember(Tencent);
ECommerce.addMember(Baidu);
ECommerce.addMember(Alibaba);
ECommerce.addMember(Tencent);
ECommerce.addMember(NTES);
Security.addMember(Kingsoft_Antivirus);
Security.addMember(_360safe);
// display the society
cout << "\n------ BAT -----\n";
BAT.displayGroup();
cout << "\n------ ECommerce -----\n";
ECommerce.displayGroup();
cout << "\n------ Security -----\n";
Security.displayGroup();
}
void test_3() {
person p0, p1, p2, p3, p4;
group g0(0), g1(0), g2(1);
// make group (act as a society)
g0.addMember(p0);
g0.addMember(p1);
g0.addMember(p2);
g1.addMember(p0);
g1.addMember(p3);
g2.addMember(p3);
g2.addMember(p4);
// construct relationship in the society
g1.makeFriend(p0, p3);
g2.breakRelation(p3, p4);
g0.deleteMember(p2);
// display the society
cout << "\n------ G0 -----\n";
g0.displayGroup();
cout << "\n------ G1 -----\n";
g1.displayGroup();
cout << "\n------ G2 -----\n";
g2.displayGroup();
}
void test_4() {
person p[50];
group g0(0), g1(1);
int p_count;
cin >> p_count;
// make group (act as a society)
for (int i = 0; i < p_count/2; i++)
g0.addMember(p[i]);
for (int i = p_count/2; i < p_count; i++)
g1.addMember(p[i]);
// construct relationship in the society
for (int i = 0; i < p_count/5; i += 2)
g0.makeFriend(p[i], p[i+1]);
for (int i = p_count/2; i < p_count*3/4-1; i += 2)
g1.breakRelation(p[i], p[i+1]);
for (int i = p_count/4; i < p_count/2; i++)
g0.deleteMember(p[i]);
for (int i = p_count*3/4; i < p_count; i++)
g1.deleteMember(p[i]);
// display the society
cout << "\n------ G0 -----\n";
g0.displayGroup();
cout << "\n------ G1 -----\n";
g1.displayGroup();
}
int main() {
int test_id;
cin >> test_id;
switch (test_id) {
case 1:
test_1();
break;
case 2:
test_2();
break;
case 3:
test_3();
break;
case 4:
test_4();
break;
default:
cout << "wrong input\n";
}
return 0;
}
/* ---------- structure for 'world.h' ----------
* define the struct and the class functions by yourself #(^_^)#
* the member function is not complete, add something as you need
struct person;
class group {
void displayGroup();
bool addMember(person &p);
bool deleteMember(person &p);
bool makeFriend(person &p1, person &p2);
bool breakRelation(person &p1, person &p2);
};
*/
思路
group的private
成員顯然需要一個容器保存每一個加進來的person,且每一個person,都需要一個容器保存他的friends,起初我是將這個容器放在了person的類定義裏,但是測試時發現這樣不同group
類型對象中的person的friends是一樣的。所以需要把friends也放進group中。
至此問題就簡化成,需要一個容器保存對象,而每個對象又有自己的保存其他對象的容器,於是我想到了std::map
,將person::id
作爲map::key_type
,並使用vector<int>
保存每個friends的id。通過std::map
自帶的接口以及<algorithm>
中的泛型算法,題目便簡化了很多。
world.h實現
#ifndef WORLD_H
#define WORLD_H
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
static int num = 0;
struct person {
int id;
person(): id(num) {
++num;
}
};
class group {
private:
map<int, vector<int>> members;
bool known;
public:
group(int i): known(i) {}
void displayGroup();
bool addMember(person &p);
bool deleteMember(person &p);
bool makeFriend(person &p1, person &p2);
bool breakRelation(person &p1, person &p2);
};
bool group::addMember(person &p) {
if (members.find(p.id) == members.end() && p.id < 9900) {
vector<int> temp;
members.insert(pair<int, vector<int>>(p.id, temp));
if (known) {
for (auto &a: members) {
if (a.first != p.id) {
a.second.push_back(p.id);
members[p.id].push_back(a.first);
}
}
}
return true;
}
return false;
}
bool group::deleteMember(person &p) {
if (members.find(p.id) != members.end()) {
members.erase(p.id);
return true;
}
return false;
}
bool group::makeFriend(person &p1, person &p2) {
if (members.find(p1.id) != members.end() && members.find(p2.id) != members.end()) {
members[p1.id].push_back(p2.id);
members[p2.id].push_back(p1.id);
return true;
}
return false;
}
bool group::breakRelation(person &p1, person &p2) {
vector<int>::iterator a = find(members[p1.id].begin(), members[p1.id].end(), p2.id);
vector<int>::iterator b = find(members[p2.id].begin(), members[p2.id].end(), p1.id);
if (members.find(p1.id) != members.end() && members.find(p2.id) != members.end() &&
a != members[p1.id].end() && b != members[p2.id].end()) {
members[p1.id].erase(a);
members[p2.id].erase(b);
return true;
}
return false;
}
void group::displayGroup() {
for (auto &m: members) {
cout << "Person_" << m.first << ": ";
if (!m.second.size())
cout << "null";
for (int i = 0; i < m.second.size(); ++i) {
cout << m.second[i];
cout << ((i + 1 < m.second.size()) ? ", " : "");
}
cout << endl;
}
}
#endif
當然,代碼可能還能進一步簡化, 此處不作深入。
Reference:www.cplusplus.com