`Vector.erase()` 不适用于类向量

Posted

技术标签:

【中文标题】`Vector.erase()` 不适用于类向量【英文标题】:`Vector.erase()` does not work for vector of classes 【发布时间】:2020-05-29 09:49:57 【问题描述】:

我制作了一类健身房通行证,它具有到期日期(int expire)、通行证价格(浮动价格)和持有人姓名(字符串数据)。它还有服务(char services),其中0是基本,1是免费淋浴,2是贵宾室。

这是类的定义:

    class GymPass
    
        int expiration; //the amount of days
        char services; //0 - basic, 1 - shower, 2 - VIP room
        float price = ((int)services - 47) * expiration;
        string data; //client's identifiable data
    public:
    
        GymPass()
        
            cout << "this: " << this;
            expiration = 0;
            services = '0';
            price = 0;
            data = "Lorem ipsum";
        
        Pass(int expiration, char services, string data)
        
            this->expiration = expiration;
            this->services = services;
            this->data = data;
        
    
        void Print()
        
            cout << "Gym Pass: ";
            switch (services)
            
            case '0':
            
                cout << "Basic gym access, ";
            
            case '1':
            
                cout << "gym + shower room, ";
            
            case '2':
            
                cout << "Luxurious gym pass with VIP room, ";
            
            default:
            
                cout << "Error."; //this should never happen
            
            
            cout << "valid for: " << expiration << " days, price: " << price << " zl." << endl;
        
        void NewPass()
        
            cout << "Choose service type: \n0 - basic\n1 - showers included\n2 - vip room included";
            
                char temp;
                do
                
                    cin >> temp;
                    if (!((int)temp > 47 & (int)temp < 51)) cout << endl << "Incorrect service type.";
                 while (!((int)temp > 47 & (int)temp < 51));
                this->services = temp;
            
            cout << endl << "Input the expiration date of the Pass:";
            cin >> this->expiration;
            cout << endl << "Input your name: ";
            cin >> this->data;
        
        friend bool operator==(const GymPass& lhs, const GymPass& rhs)
        
            if (lhs.price != rhs.price) return false;
            if (!(lhs.data._Equal(rhs.data))) return false;
            if (lhs.services != rhs.services) return false;
            if (lhs.expiration != rhs.expiration) return false;
            return true;
        
    ;

我还创建了一个类,它基本上是我的GymPass 类的向量。我正在尝试创建一个 void 函数来删除一张健身房通行证,但擦除会引发错误:

no instance of overloaded function "std::vector&lt;_Ty, _Alloc&gt;::erase [with _Ty=GymPass, _Alloc=std::allocator&lt;GymPass&gt;]" matches the argument list

就像一个优秀的程序员一样,我已经进行了数小时的谷歌搜索,但没有运气。这是体育课的定义

     class Gym
    
        vector <GymPass> Clients;
    public:
        void add(GymPass pass)
        
            Clients.push_back(pass);
        
        void remove(GymPass pass)
        
            for (int i = 0; i < Clients.size(); i++)
            
                if (Clients[i] == pass) Clients.erase(i);
            
        
    ;

void remove 是删除功能,我得到错误。如何修复错误?

【问题讨论】:

请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 使用擦除时:不要循环增加索引!请参阅我对这个问题的回答:***.com/questions/875103/… 【参考方案1】:

std::vector::erase 采用 iterator 而不是 index 作为参数。

Stali_Klienci.erase(Stali_Klienci.begin() + i);

是一个合理的 hack。 Stali_Klienci.begin() 是第一个元素的迭代器,+ i 将迭代器递增到 ith 元素。

如果您想从std::vector 中删除每个元素,那么clear 会在一次调用中完成。

【讨论】:

解决了,非常感谢!另外,也许这是一个新手问题,但看起来很傻。向量不应该即时将索引转换为迭代器吗?【参考方案2】:

您必须先阅读 erase() 文档:erase() 需要一个迭代器

那么这样的事情必须完成:

for (auto it = Stali_Klienci.begin(); it != Stali_Klienci.end(); ) 

   if (*it == karnet) 
        it = c.erase(it);
    else 
        ++it;
   

【讨论】:

以上是关于`Vector.erase()` 不适用于类向量的主要内容,如果未能解决你的问题,请参考以下文章

Vector.erase 中的 SIGSEGV

std::vector.erase() 只擦除它应该擦除的一半

对 2D 或 3D 向量使用擦除删除习语

是否有一个函数可以从向量中删除一个元素而不在 c++ stdlib 中移动它?

基于类的 Vue 组件不适用于 v-model 和 vuex

标准向量性能/替代