如何从自定义对象的std::vector中删除元素?编译报错求助
解决std::vector::erase删除自定义Person对象的报错问题
你代码里的错误主要有三个,逐个修正就能解决:
错误点1:调用了不存在的成员函数
book.get_name() 是错误的,book 是std::vector<Person>类型,没有get_name成员,你应该访问循环中的Person对象的get_name,也就是p.get_name()。
错误点2:std::vector::erase的参数错误
erase函数不接受对象作为参数,它需要的是迭代器(指向要删除元素的迭代器),而不是对象实例。
错误点3:遍历过程中erase会导致迭代器失效
用范围for循环遍历的时候直接erase元素,会破坏vector的内部结构,导致迭代器失效,引发未定义行为。正确的做法是用迭代器遍历,并利用erase的返回值更新迭代器。
修改后的完整代码:
Person类(修正成员函数的const属性,更规范)
#include <string> #include <vector> using namespace std; class Person { private: string name; public: void set_name(string name) { this->name = name; } // 读取成员的函数应该声明为const string get_name() const { return name; } };
Record类(修正delete_person函数)
class Record { private: vector<Person> book; public: void delete_person(string name) { // 使用迭代器遍历 for (auto it = book.begin(); it != book.end(); ) { // 因为get_name是const函数,这里可以直接调用 if (it->get_name() == name) { // erase返回下一个有效的迭代器,直接赋值给it it = book.erase(it); } else { // 没有删除时,正常移动迭代器 ++it; } } } // 新增封装添加逻辑的函数,避免直接访问私有成员 void add_person(const Person& p) { book.push_back(p); } };
main函数(示例用法)
int main() { Record r; Person p1, p2; p1.set_name("Alice"); p2.set_name("Bob"); r.add_person(p1); r.add_person(p2); r.delete_person("Alice"); return 0; }
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

