[英]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.