利用STL之map取巧做题过程

    xiaoxiao2021-04-17  34

    前言:这是我的一道作业题,为了减少代码量,我使用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

    转载请注明原文地址: https://ju.6miu.com/read-673845.html

    最新回复(0)