这个问题更倾向于如何有效地设计此解决方案: 作为我试图解决的问题的类比,请考虑我有一个与每门课程相关的学生列表。
课程A:list-of-students_1
课程B:学生名单_2 ....
注意:
- >同一个学生可以参加多门课程。
- >学生名单经常更改
现在,我应该在这里执行两项操作:
A)。具有特定课程公告的功能:在这种情况下,我需要参加该课程的学生名单。
B)。具有查询学生注册的所有课程的功能。
我看过boost多索引容器,但是他们不能解决问题:我的数据不是"当然:学生"可以根据键进行排序;它更像是"当然:list_of_students"如果在每门课程中查看它。
最接近的设计模式(我对设计模式非常新)是观察者模式,但更多的是单向事物:我必须有一个双向观察者模式来有效地解决这个问题。
现在,有一个类似问题的现有主题:Data structure: Is there something like a two way observer pattern? 它的答案并不令人满意。我不确定恢复一年之久的线程或开始新线程是不是一个好主意,所以我选择了后者。
任何帮助都将得到真诚和真诚的感谢。提前谢谢。
答案 0 :(得分:0)
// Sorted (any deterministic comparison) random access
// collections of student and course descriptors/records
//
// Insertion via binary search (SO search "c++ insert to sorted vector)
vector<student> students;
using students_t = decltype(students);
vector<course> courses;
using courses_t = decltype(courses);
// bidirectional student to course relation map
boost::bimap::bimap<
multiset<students_t::size_type>,
multiset<courses_t::size_type>
> assignments;
using assignments_t = decltype(assignments);
或者
// record must be inserted to students_t/courses_t before its enrollments_/subscriptions_ can be populated
struct enrolled_student {
student student_;
set<courses_t::size_type> enrollments_;
}
struct subscribed_course {
course course_;
set<students_t::size_type> subscriptions_;
}
vector<enrolled_student> students;
using students_t = decltype(students);
vector<subscribed_course> courses;
using courses_t = decltype(courses);
答案 1 :(得分:0)
我还要考虑的是再次看一下这个问题:
学生经常列出变化?它的变化频率如何?当学生注册课程时,有一个截止时间 - 之后您将注册到课程结束,并且无法再次注册。即使你可以,这种情况多久发生一次?
其次,学生可以报名参加不同课程的事实不是问题或问题定义,我宁愿说这是学生的一个属性。
也许看看为课程创建一个对象,让它有一个学生列表(矢量)。并创建一个名为student的对象,该对象有一个他/她订阅的列表(课程的矢量)。
我认为这里的问题是你想要的解决方案比实际问题复杂得多。也许看看重新设计一下。如果您需要帮助,可以再次给我发消息。
这是一个哲学答案,但它可能会帮助你更多地实现你的解决方案。