You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从自定义对象的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:05:22