繁体   English   中英

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

[英]Vector.erase() does not work for vector of classes

我正在为我的考试编写代码,但我遇到了一个问题。 我制作了一张 class 健身房通行证,上面有到期日期(int waznosc)、通行证价格(float cena)和持有人姓名(string dane)。 它还有服务(char uslugi),其中 0 是基本服务,1 是免费淋浴,2 是贵宾室(这只是我考试的示例代码)。

这是 class 的定义(注释为波兰语):

class Karnet
{
    int waznosc; //ilosc dni
    char uslugi; //0 - podstawowy, 1 - prysznic, 2 - sala VIP
    float cena = ((int)uslugi - 47) * waznosc; //ilosc dni * pakiet uslug, np. podstawowy na miesiac to 30 * 1, a z sala VIP na 3 miesiace to 90 * 3 = 270
    string dane; //imie_nazwisko kupujacego
public:

    Karnet() //podstawowy konstruktor
    {
        cout << "this: " << this;
        waznosc = 0;
        uslugi = '0';
        cena = 0;
        dane = "Lorem ipsum";
    }
    Karnet(int waznosc, char uslugi, string dane) //konstruktor z parametrami
    {
        this->waznosc = waznosc;
        this->uslugi = uslugi;
        this->dane = dane;
    }

    void wypisz()
    {
        cout << "Karnet: ";
        switch (uslugi)
        {
        case '0':
        {
            cout << "Podstawowy dostep do silowni, ";
        }
        case '1':
        {
            cout << "Pakiet silownia + prysznice, ";
        }
        case '2':
        {
            cout << "Luksusowy pakiet ze specjalna sala VIP, ";
        }
        default:
        {
            cout << "Blad."; //nie powinien nigdy default wystapic
        }
        }
        cout << "wazny " << waznosc << " dni, koszt " << cena << " zl." << endl;
    }
    void wpisz()
    {
        cout << "Wybierz pakiet uslug: \n0 - podstawowy\n1 - darmowe prysznice\n2 - specjalna sala vip";
        {
            char temp{};
            do
            {
                cin >> temp;
                if (!((int)temp > 47 & (int)temp < 51)) cout << endl << "Prosze wpisac cyfre odpowiadajaca pakietowi uslug...";
            } while (!((int)temp > 47 & (int)temp < 51));
            this->uslugi = temp;
        }
        cout << endl << "Podaj ilosc dni, na ktora chcesz wykupic karnet: ";
        cin >> this->waznosc;
        cout << endl << "Podaj swoje imie i nazwisko: ";
        cin >> this->dane;
    }
    void przedluz(int oile)
    {
        cout << "Przedluzenie waznosci o " << oile << " dni bedzie kosztowac " << oile * ((int)this->uslugi - 47) << ", kontynuowac? (t/n) ";
        char temp{};
        if (temp != 't') return;
        this->waznosc += oile;
    }
    friend bool operator==(const Karnet& lhs, const Karnet& rhs)
    {
        if (lhs.cena != rhs.cena) return false;
        if (!(lhs.dane._Equal(rhs.dane))) return false;
        if (lhs.uslugi != rhs.uslugi) return false;
        if (lhs.waznosc != rhs.waznosc) return false;
        return true;
    }
};`

我还制作了一个 class ,它基本上是我的 Karnet 类的向量。 我正在尝试创建一个 void function 来删除一个 karnet,但擦除会引发错误:

no instance of overloaded function "std::vector<_Ty, _Alloc>::erase [with _Ty=Karnet, _Alloc=std::allocator<Karnet>]" matches the argument list

就像一个优秀的程序员一样,我已经做了几个小时的谷歌搜索,但没有运气。 这是健身房 class 的定义(西洛尼亚)

 class silownia
{
    vector <Karnet> Stali_Klienci;
public:
    void dodaj(Karnet karnet)
    {
        Stali_Klienci.push_back(karnet);
    }
    void usun(Karnet karnet)
    {
        for (int i = 0; i < Stali_Klienci.size(); i++)
        {
            if (Stali_Klienci[i] == karnet) Stali_Klienci.erase(i);
        }
    }
};

void usun 是删除 function,我得到错误。 告诉我是否需要翻译任何评论,但他们正在学习评论,而不是什么-算法-做什么评论。 我已经准备好所有程序,我所需要的只是修复这部分。

std::vector::erase迭代器而不是索引作为参数。

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

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

如果您想从std::vector中删除每个元素,那么clear在一次调用中执行此操作。

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

然后像这样的东西必须完成这项工作:

for (auto it = Stali_Klienci.begin(); it != Stali_Klienci.end(); ) 
{
   if (*it == karnet) {
        it = c.erase(it);
   } else {
        ++it;
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM