从C ++列表中删除对象

时间:2015-03-31 21:24:32

标签: c++ list

我是C ++的新人......我正在上课 - 一个是学生,另一个是课程。有一个"列表"添加学生对象的课程内部。

我可以添加一名学生:

void Course::addStudent(Student student)
{
    classList.push_back(student); 
}

但是当我去删除学生时,我无法将其删除。我得到一个很长的错误,关于Student不能派生出来,而且关于operator ==(const allocator)。

void Course::dropStudent(Student student)
{
     classList.remove(student); 
}

有什么建议吗? 谢谢!!

我指的是如何添加/删除元素的网站:http://www.cplusplus.com/reference/list/list/remove/

学生代码:

class Student {
std::string name; 
int id; 
public:
void setValues(std::string, int); 
std::string getName();
};

void Student::setValues(std::string n, int i)
{
name = n; 
id = i; 
};

std::string Student::getName()
{
    return name; 
}

完整课程代码:

class Course 
{
std::string title; 
std::list<Student> classList; //This is a List that students can be added to. 
std::list<Student>::iterator it; 

public: 
void setValues(std::string); 
void addStudent(Student student);
void dropStudent(Student student);
void printRoster();
};
void Course::setValues(std::string t)
{
    title = t;  
};

void Course::addStudent(Student student)
{
    classList.push_back(student); 
}

void Course::dropStudent(Student student)
{
    classList.remove(student);
}

void Course::printRoster()
{
    for (it=roster.begin(); it!=roster.end(); ++it)
    {
        std::cout << (*it).getName() << " "; 
    }
}

4 个答案:

答案 0 :(得分:7)

std::list::remove()会删除列表中 compare equal 与您提供的元素的所有元素。您未定义Student,但可能未定义operator == ()方法,因此对remove()的调用无效。

答案 1 :(得分:4)

正如所指出的,问题是Student缺少operator==所需的std::list::remove

#include <string>
class Student {
    std::string name; 
    int id; 

public:
    bool operator == (const Student& s) const { return name == s.name && id == s.id; }
    bool operator != (const Student& s) const { return !operator==(s); }
    void setValues(std::string, int); 
    std::string getName();
    Student() : id(0) {}
};

请注意operator==operator !=的重载方式。如果可以将两个对象与==进行比较,则应该可以使用!=。根据{{​​1}}检查operator!=的写作方式。

另请注意,参数作为const引用传递,函数本身为operator ==

直播示例:http://ideone.com/xAaMdB

答案 2 :(得分:2)

该列表无法删除您的学生,因为它无法知道如何将列表中的学生与remove方法中的学生进行比较。
注意学生按值传递,因此与列表中的实例不同。

您可以做的一件事是在operator==中实施Student,这将有助于列表找到您的学生。

另一种可能性(如果你不能改变Student类特别相关)将保持Student*(学生指针)列表,然后列表将能够比较指针,找到你想要移除的那个。

答案 3 :(得分:0)

void Course::dropStudent(Student student)
{
    list<Student>::iterator itr=classList.begin();
    list<Student>temporary;
    while(itr!=classList.end())
    {
        if(itr->id!=student.id)
        {
            temporary.push_back(itr);
        }
        itr++;
    }
    classList=temporary;
}