从数组 C++ 中删除类

Posted

技术标签:

【中文标题】从数组 C++ 中删除类【英文标题】:Removing classes from an array C++ 【发布时间】:2021-09-18 19:05:50 【问题描述】:

我有一个用于类的向量数组,并且我正在创建一个可以使用 std::remove() 从该数组中删除类的方法。问题是 Weapon(类)没有 std::remove 需要比较元素的运算符 ==。

代码:

class Weapon 
public:
    std::string name;
    Weapon(std::string x) 
        name = x;
    
    Weapon() 
;

std::vector<Weapon> inventory;

void removeInventory(Weapon x) 
    if (inventorySize != 0) 
        auto deleteFromInc = inventory.erase(std::remove(std::begin(inventory), std::end(inventory), x), std::end(inventory));
        if (deleteFromInc != std::end(inventory)) 
                std::cout << "Item didn't delete\n";
         else 
            if (heldWeapon.name == x.name) 
                heldWeapon = Weapon();
            
            inventorySize = inventory.size();
            std::cout << "Item deleted\n";
        
     else 
        std::cout << "You have no items\n";
    

错误:

Rebuild started...
1>------ Rebuild All started: Project: rpag, Configuration: Debug Win32 ------
1>rpag.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\include\xmemory(1945,1): error C2678: binary '==': no operator found which takes a left-hand operand of type 'Weapon' (or there is no acceptable conversion)
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\guiddef.h(192,15): message : could be 'bool operator ==(const GUID &,const GUID &)' [found using argument-dependent lookup]
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\include\xmemory(1945,1): message : while trying to match the argument list '(Weapon, const _Ty)'
1>        with
1>        [
1>            _Ty=Weapon
1>        ]
1>C:\Users\alber\source\repos\rpag\rpag\rpag.cpp(89): message : see reference to function template instantiation '_FwdIt std::remove<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>,Weapon>(_FwdIt,const _FwdIt,const _Ty &)' being compiled
1>        with
1>        [
1>            _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Weapon>>>,
1>            _Ty=Weapon
1>        ]
1>Done building project "rpag.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

这是我的第一个问题!我希望一切都清楚。

【问题讨论】:

请发帖minimal reproducible example。如果不使用operator==,您打算如何比较两个Weapons? 问不同:给定武器x,你怎么知道你想从向量中删除哪一个? 调用函数时 【参考方案1】:

std::remove 需要 operator== (这是 c++ 标准库的要求)。您可以将运算符添加到您的类中,或使用std::remove_if - 它使用谓词 - 外部函数进行比较。

还有第三种方法:你可以手动从向量中擦除项目:for (...) erase ...

【讨论】:

你能举个例子吗? 发现了一些东西en.cppreference.com/w/cpp/algorithm/remove 早期:武器参考值;进入你的擦除: ... std::remove(std::begin(inventory), std::end(inventory), [reverence_value](const Weapon& item) return reference_value.name == item.name; ) 。 .. 让它工作:auto deleteFromInc = inventory.erase(std::remove_if(std::begin(inventory), std::end(inventory), [x](const Weapon& item) return x.name == item.name; ), inventory.end());你忘了使用 remove_if 哈哈。我在挠头 x)

以上是关于从数组 C++ 中删除类的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的排序数组中删除重复项

从文件中删除单词每次用户输入要删除的单词并将新数组写入新文件。 C++

删除数组指针C++时堆损坏

删除类中的动态二维数组时,C++ 不断出现“中止(核心转储)”

如何通过 C++ 中指向该数组的指针访问另一个类中的数组?

将二维数组传递给另一个类 C++