如何从矢量中查找和删除对象
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 号的对象 I 输入,但这是它给出的输出:
ID# not found
ID# not found
ID# not found
ID# not found
它停在那里,因为在我的程序中,3 是列表中的第 4 个 ID 号。任何人都可以看到我的代码有什么问题吗?为什么要这样做?
我想你想按如下方式完成它:
- 如果您输入了任何 ID,请删除所有 ID,并且不要打印任何消息。
- 如果未找到 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::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
。
相关文章:
- 内存泄漏如何查找和删除
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 查找并删除文件 C++ 中的整行
- 查找排序的容器,其中指向元素的指针在添加/删除时不会更改
- 如何查找/删除具有特定参数的结构向量的元素
- 重复删除子字符串后,查找剩余的字符串
- 是否有具有对数时间插入、删除和查找(带距离)的排序数据结构
- 二叉搜索树查找和删除 [C++]
- 在任意位置进行快速查找和删除的Deque样数据结构
- STD :: MAP-如何查找或添加,然后可以在一次搜索中删除项目
- 具有非常快速的内>数据查找和快速反向查找(搜索/插入/删除数据)的压缩字典?
- C++删除运算符如何查找多态对象的内存位置
- 在向量中查找元素并将其删除
- 从给定号码中查找并删除号码
- 难以搜索"craigslist"数组以查找匹配项并删除匹配的行并将所有内容向上移动
- 查找最大值并删除 2D 数组中的该行.C++
- 如何从矢量中查找和删除对象
- 查找从未排序数组中删除的一个和 N 个元素
- 如何查找要从向量中删除的值,以及如何从辅助向量中删除相同的位置
- 使用 STL 容器在 logN 中插入、查找最小(键)和删除(基于值)功能