一个向量C ++中的两种类型的值

时间:2016-01-11 15:04:53

标签: c++ vector

假设我有一个班级学生的向量,但问题的要求表明我不能将等级放在构造函数中,所以我将不得不解决它。

我可能在一个向量槽中有两个值吗?

例如,Student类和字符串成绩是我的论点。

vector<Student*, string> Students;

所以,在一天结束的时候,如果我对该向量进行cout,我应该在一个位置获得学生和成绩。

这有用吗?如果是这样,我如何push_back值?

否则,还有另一种方法吗?

3 个答案:

答案 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。

http://www.cplusplus.com/reference/map/map/