简体   繁体   English

C ++按值擦除向量元素

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

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