基本上我需要一个Subject类和一个Student类。一个学生可以注册多个科目,一个科目可以有很多学生吗?
如何连接课程?感谢。
答案 0 :(得分:2)
其他类的set<>
(或unordered_set<>
可用)。只需确保在添加或删除学生/主题对时,set<>
被修改。
答案 1 :(得分:1)
您需要的不仅仅是学科和学生班级
这是我如何实现它。
(是的,弗吉尼亚州,数据库概念可以在不使用数据库软件的情况下用C ++实现)。
阅读Database Normalization.
该学院由学科和学生都参考。这表明教师有一个单独的表。主题和学生结构中的Faculty字段应链接到Faculty表中的条目。
+------------+--------------+
| ID_Faculty | Faculty Name |
+------------+--------------+
主题记录包含两个单项目字段(代码和教师)和一个容器(学生)。大多数关系数据库都讨厌包含容器的记录,因此必须将容器考虑在内。在这种情况下,[学生,主题]表格就足够了。构建主题记录的容器时,将搜索此表以查找具有相同主题ID的所有条目并将其添加到容器中。为了澄清代码,让我们创建单独的记录:
+------------+--------------+------------+--------------+
| ID_Subject | Subject_Code | ID_Faculty | Subject Name | <-- Subject_Entry
+------------+--------------+------------+--------------+
和
+------------+------------+
| ID_Subject | ID_Student | <-- Subject_Student_Record
+------------+------------+
Subject_Entry记录满足Subject_Student_Record中ID_Subject字段的链接。现在需要一些东西来满足ID_Student字段。让我们创建Student_Entry记录:
+------------+------------+--------------+
| ID_Student | ID_Faculty | Student_Name |
+------------+------------+--------------+
此记录包含学生的原始或基本属性。可以从学生 - 学生表中确定学生注册的科目。
实施 学生和主题记录主要通过其ID字段进行搜索,其次是按名称字段进行搜索。选择适当的C ++容器或编程数据结构是一个选择问题。对于这个简单的练习,使用非关键字段进行搜索没有性能下降。
我建议将std::map
用于学生和主题记录,因为ID字段应该是唯一的。
Subject-Student表中没有唯一键,因此我们无法利用std::map
的性能优势。同样,这是一个小项目,因此组织数据以进行进一步优化将产生可忽略的性能增益,但是复杂性很大。因此,让我们使用std::vector
作为Subject-Student表。
这些对象在输入和输出期间只有概念。它们的属性包含在上述数据结构中。我的建议是没有Subject和Student类,只是检索它们的属性。你的里程可能会变化。
实际的实施或编码留给读者练习。
答案 2 :(得分:0)
我可能不会联系到它们在现实世界中,我会使用数据库和数据库语句来填充您需要的控件,如果我真的必须使用类,我唯一一次使用集合来存储关系是我需要缓冲“可逆”变化或在整个集合上执行一些大型业务逻辑。
答案 3 :(得分:0)
在每个条目必须具有唯一主键的关系数据库世界中,您有一个“注册”表,其中每个条目有一个学生和一个主题,因此您有多个注册,可以按学生和主题。
如果需要,您可以在C ++中执行相同的操作,尽管您需要它们的多索引。但是,您可以轻松地创建自己。这使您可以执行5和6。
您可以将学生对象的指针和主题对象的指针存储在此“注册”类中,而不是它们的“id”。这样你就可以直接找到学生/主题,而不必在桌子上查看。
当然,如果注册学生的方法需要输入他们的id,你需要能够将id与指针匹配。学生和科目可以存储在std :: set或std :: map中,id为查找。
假设你不能使用boost多索引(即使你被允许使用shared_ptr,你应该这样做),你只需创建一些指向注册的指针向量,并按照student-id和subject对它们进行排序-id(您应该能够从注册中提取为一种简单的“获取”方法)。