假设我有一个班级学生的向量,但问题的要求表明我不能将等级放在构造函数中,所以我将不得不解决它。
我可能在一个向量槽中有两个值吗?
例如,Student类和字符串成绩是我的论点。
vector<Student*, string> Students;
所以,在一天结束的时候,如果我对该向量进行cout,我应该在一个位置获得学生和成绩。
这有用吗?如果是这样,我如何push_back值?
否则,还有另一种方法吗?
答案 0 :(得分:8)
std::vector<std::pair<Student*, string>> students;
甚至更好:
std::map<Student*, string> students;
推动价值观
第一种情况:
students.push_back(std::make_pair(x,y));
甚至更好(正如@snps建议的那样):
students.emplace_back(x, y);
第二种情况:
students[x]=y;
请注意,在第二种情况下,您无法添加具有相同Student*
值的多个记录。如果你尝试它会写过旧的。
答案 1 :(得分:2)
有多种方法可以实现这一目标。
一个。结构数组:
A1。组合物:
class GradedStudent {
Student body;
string grade;
public:
GradedStudent(const string& grade);
// reimplement all methods of `Student`,
// delegating implementations to `body`
};
std::vector<GradedStudent> gradedStudents;
A2。继承(所有学生都有成绩):
class Student {
public:
Student();
};
class GradedStudent {
string grade;
public:
GradedStudent(const string& grade);
};
std::vector<GradedStudent*> gradedStudents;
A3。继承+多态 (有些学生有成绩,有些没有成绩):
class Student {
public:
Student();
virtual ~Student();
virtual const string& getGrade() const { return ""; }
};
class GradedStudent : public IStudent {
string grade;
public:
GradedStudent(const string& grade);
virtual string getGrade() const override { return grade; }
};
std::vector<Student*> students;
// non graded students will have empty string as a grade
B中。阵列结构方法(等级的单独数组):
std::vector<Student*> students;
std::vector<string> grades;
for(int i = 0; i < students.size(); ++i) {
auto* student = students[i];
auto grade = grades[i];
}
℃。关联容器(不尊重“使用std :: vector”要求):
std::map<Student*, string> students;
for(auto student : students) {
auto* student = student.first;
auto grade = student.second;
}
这些是经典的。可能会有更多。
如果所有学生都有成绩,你应该真正使成绩成为这门课程的一员。
P.S。你真的需要在向量中存储指针(而不是存储对象)吗?
答案 2 :(得分:1)
你可以使用std :: map。