如何有效地设计多键查找,其中一个键是C ++中元素的向量

时间:2014-09-30 07:56:27

标签: c++ design-patterns data-structures

这个问题更倾向于如何有效地设计此解决方案: 作为我试图解决的问题的类比,请考虑我有一个与每门课程相关的学生列表。

课程A:list-of-students_1

课程B:学生名单_2 ....

注意:

- >同一个学生可以参加多门课程。

- >学生名单经常更改

现在,我应该在这里执行两项操作:

A)。具有特定课程公告的功能:在这种情况下,我需要参加该课程的学生名单。

B)。具有查询学生注册的所有课程的功能。

我看过boost多索引容器,但是他们不能解决问题:我的数据不是"当然:学生"可以根据键进行排序;它更像是"当然:list_of_students"如果在每门课程中查看它。

最接近的设计模式(我对设计模式非常新)是观察者模式,但更多的是单向事物:我必须有一个双向观察者模式来有效地解决这个问题。

现在,有一个类似问题的现有主题:Data structure: Is there something like a two way observer pattern? 它的答案并不令人满意。我不确定恢复一年之久的线程或开始新线程是不是一个好主意,所以我选择了后者。

任何帮助都将得到真诚和真诚的感谢。提前谢谢。

2 个答案:

答案 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的对象,该对象有一个他/她订阅的列表(课程的矢量)。

我认为这里的问题是你想要的解决方案比实际问题复杂得多。也许看看重新设计一下。如果您需要帮助,可以再次给我发消息。

这是一个哲学答案,但它可能会帮助你更多地实现你的解决方案。