[英]How to find and remove an object from a 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号。 谁能看到我的代码出了什么问题? 为什么这样做呢?
我想您想按以下方式完成它:
实现这些要求的代码如下:
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 :: remove , std :: vector迭代器无效 。
该代码可以工作,但是我建议使用前面提到的std :: remove和std :: remove_if ,因为它们使代码更易于阅读和维护。 (请参阅--it3;行。)此外,它们的运行速度可能更快。
您可以使用std::remove
或std::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());
现在,您正在将迭代器的数据位置与用户输入进行比较。 你写的地方
if ( it == userinput )
尝试写作
if ( it->ID == userinput )
假设您的id字段名为ID
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.