[英]C++ Erase vector element by value
I have a vector with Cards and i need to find card and remove it . 我有一个带有Cards的向量, 我需要找到card并将其删除 。 I tryed the code below but I am getting error: binary '==': no operator found which takes a left-hand operand of type 'Card' 我尝试了下面的代码,但出现错误: 二进制'==':找不到使用'Card'类型的左操作数的运算符
The code makes sense to me. 该代码对我来说很有意义。 Could you give me some tips how to make it works? 您能给我一些使它起作用的提示吗? Thanks! 谢谢!
void Player::RemoveCardFromPackage(const Card& cardToBeRemoved)
{
std::vector<Card>::iterator position = std::find(CadrVector.begin(), CadrVector.end(), cardToBeRemoved);
if (position != CadrVector.end())
{
CadrVector.erase(position);
}
}
How do you expect std::find()
to know how to compare two elements of your custom type CadrVector
? 您如何期望std::find()
知道如何比较自定义类型CadrVector
两个元素? When two of these elements are considered equal and when not? 这些元素中的两个元素何时相等,什么时候不相等? You have to define that. 您必须定义它。
So either pass a comparator to the fourth argument of std::find()
, or overload the ==
operator of your type. 因此,要么将比较器传递给std::find()
的第四个参数,要么重载您类型的==
运算符。
You can try find_if
instead, with custom compare function: 您可以尝试使用自定义比较功能来find_if
:
#include <iostream>
#include <algorithm>
#include <vector>
class Card
{
int c;
public:
Card(int c): c(c) {}
int GetC() const { return c; }
};
std::vector<Card> CardVector;
class Player
{
public:
void RemoveCardFromPackage(const Card& cardToBeRemoved);
};
void Player::RemoveCardFromPackage(const Card& cardToBeRemoved)
{
auto found = std::find_if(CardVector.begin(), CardVector.end(), [&cardToBeRemoved](Card const &card)
{
return cardToBeRemoved.GetC() == card.GetC();
});
if (found != CardVector.end())
{
CardVector.erase(found);
}
}
int main()
{
Player p;
Card c1(1);
CardVector.push_back(c1);
Card c2(2);
CardVector.push_back(c2);
Card c3(3);
CardVector.push_back(c3);
std::cout << "Before:\n";
for (size_t i = 0; i < CardVector.size(); ++i)
std::cout << "Card C: " << CardVector[i].GetC() << " ";
p.RemoveCardFromPackage(c2);
std::cout << "\n\nAfter:\n";
for (size_t i = 0; i < CardVector.size(); ++i)
std::cout << "Card C: " << CardVector[i].GetC() << " ";
return 0;
}
Prints: 印刷品:
Before:
Card C: 1 Card C: 2 Card C: 3
After:
Card C: 1 Card C: 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.