如何从向量中查找和删除对象?

时间:2016-03-04 02:55:27

标签: c++ oop object vector

我有一个名为GradeBook的类,我已经在类中定义了包含学生ID,姓名和成绩的对象。我的代码的这部分工作正常,它将对象存储到向量中并正确打印。我已经尝试了几个小时,无法弄清楚或找不到如何获取用户输入整数,查找它是否与向量中的学生ID匹配并删除相应的行。

我的代码:

int main(){
...
int userinput;
vector <GradeBook> vec;  //named vector "vec"

GradeBook gradeBook1(1, "Bob", 72.3); //created an object in GradeBook
vec.push_back(gradeBook1);    //object contains ID#, name, grade
GradeBook gradeBook2(4, "Jim", 85.4);
vec.push_back(gradeBook2);
GradeBook gradeBook3(2, "Rob", 99.6);
vec.push_back(gradeBook3);
GradeBook gradeBook4(3, "Ron", 89.7);
vec.push_back(gradeBook4);
GradeBook gradeBook5(5, "Jon", 66.9);
vec.push_back(gradeBook5);

cout << "Enter the ID# of student you want to remove: ";
cin >> userinput;

vector <GradeBook>::iterator it;     //this is where i'm having trouble
for (it = vec.begin(); it != vec.end(); it++) { 
        if ( it == userinput ){     //I get a bunch of errors here
        //i'm not sure how to equate the user input to the iterator
            vec.erase(vec.begin()+userinput);
        else
        {
        cout << "ID # not found" << endl;
        }
}

....
return 0;
}

更新

感谢您的所有评论,我将所有这些评论考虑在内并最终修复了我的代码。现在,它读取用户输入ID#并找到包含它的对象。但是,它仍然无法正常工作。

这是我的新代码:

cout << "enter ID to remove" << endl;
cin >> userinput;

vector <GradeBook>::iterator it3;
for (it3 = vec.begin(); it3 != vec.end(); ++it3) {
    if ( it3->studentID == userinput ){    
        vec.erase(vec.begin()+userinput)
    }
    else
    {
        cout << "ID # not found" << endl;
    }
}

我输入了要删除的ID#3作为测试。 这循环直到它正确找到具有我输入的ID号的对象,但这是它给出的输出:

ID# not found
ID# not found
ID# not found
ID# not found

它停在那里因为在我的程序中,3是列表中的第4个ID号。任何人都可以看到我的代码有什么问题吗?为什么这样做?

3 个答案:

答案 0 :(得分:1)

我想你想按照以下方式完成它:

  1. 如果您输入了任何ID,请删除所有ID,不要打印任何消息。
  2. 如果未找到ID,请打印出错误消息。
  3. 实现这些要求的代码如下:

    cout << "enter ID to remove" << endl;
    cin >> userinput;
    
    bool isFound = false;
    vector <GradeBook>::iterator it3;
    for (it3 = vec.begin(); it3 != vec.end(); ++it3) {
        if (it3->studentID == userinput) {
            it3 = vec.erase(it3); // After erasing, it3 is now pointing the next location.
            --it3; // Go to the prev location because of ++it3 in the end of for loop.
            isFound = true;
        }
    }
    
    if (!isFound) {
        cout << "ID # not found" << endl;
    }
    

    在vector :: erase之后删除元素,传递给函数的迭代器无效。所以你应该得到一个新的迭代器vector :: erase返回。有关详情,请查看:vector::removestd::vector iterator invalidation

    此代码有效,但我建议使用前面提到的std::removestd::remove_if,因为它们使代码更易于阅读和维护。 (参见--it3; line。)此外,它们可能运行得更快。

答案 1 :(得分:0)

您可以使用std::removestd::remove_if

vec.erase(std::remove(vec.begin(), vec.end(), userinput), vec.end());

如果要删除的项目需要满足其他一些条件,您可以使用std::remove_if

vec.erase(std::remove_if(vec.begin(), vec.end(), [](auto item) { ... }), vec.end());

答案 2 :(得分:0)

现在,您正在将迭代器的数据位置与用户输入进行比较。你写的地方

 if ( it == userinput )

尝试写作

 if ( it->ID == userinput )

假设您的ID字段名为ID