从向量中删除自定义对象

时间:2013-07-10 16:45:09

标签: c++ vector

我有以下代码在向量中存储LVA类型的对象。 我已经实现了一种向矢量添加LVA对象的方法。 第一个问题:如果我在这种方法中使用对LVA对象的引用是否可以?

现在我想实现一种删除LVA对象的方法。我想要以下方法签名:void RemoveLVA(LVA& lva)。我该如何实现这个方法?即如何在向量中找到正确的对象来删除它?

Manager.h

class Manager {
public:
    Manager();
    Manager(const Manager& orig);
    virtual ~Manager();
    vector<LVA> GetLvas() const;
    void AddLva(LVA& lva);
private:
    vector<LVA> lvas;

};

Manager.cpp:

#include "Manager.h"

Manager::Manager() {
}

Manager::Manager(const Manager& orig) {
}

Manager::~Manager() {
}

vector<LVA> Manager::GetLvas() const {
    return lvas;
}

void Manager::AddLva(LVA& lva) {
    lvas.push_back(lva);
}

6 个答案:

答案 0 :(得分:1)

  

如果我在这种方法中使用对LVA对象的引用是否可以?

没问题。您实际上正在通过push_back操作进行复制。

答案 1 :(得分:1)

  

如果我在AddLva(LVA&amp; lva)中使用LVA对象的引用可以吗?

是的,在std::vector完成后,push_back()将拥有原始对象的副本

  

如何实施RemoveLVA(LVA&amp; lva)?

您需要在向量中找到对象。 (如果为std::find()定义了operator==(),则可以使用LVA。)然后为您的向量调用erase()函数。

答案 2 :(得分:1)

在不了解LVA的情况下,很难准确,但是 你可能想要AddLva的const引用,因为你是 不在函数中修改它(你可能想通过 暂时的。)

要删除:你必须定义某种类型 LVA上的等价函数是否要删除匹配项 元件。这可以是LVA::operator==,或其他一些对象或 功能:在第一种情况下,您使用std::find来查找 位置,在第二个,std::find_if。如果矢量可以包含 您可能需要查看std::removestd::remove_if

答案 3 :(得分:0)

您的插入方法是正确的,但不要忘记只有LVA对象的副本才会插入到矢量中。这意味着,与RemoveLVA方法相比,您需要使用类似operator==重载的内容来std::find与您的参数匹配的向量对象,然后将其删除。

您可能更喜欢在向量中插入指针或std::shared_ptr LVA。然后不会发生对象复制,并且对象的搜索将回退到指针的比较,因为您将指针保留在程序中的其他位置(具有相同内容和不同堆栈或堆位置的2个对象将比较为false)

答案 4 :(得分:0)

是的,AddLva可以参考,但通常需要const参考:

void Manager::AddLva(const LVA& lva) {
    lvas.push_back(lva);
}

但请注意,如果您希望将引用添加到vector,则不会这样做。制作了对象lva的副本,并将该副本添加到向量中。

答案 5 :(得分:0)

是的,可以在添加和删除方法中将LVA对象作为ref传递。您也可以将这些参数声明为'const',因为我认为添加和删除不会影响对象。

用于删除方法

void RemoveLVA(const LVA& lva)
{
    std::vector<LVA>::iterator position =
    std::find(lvas.begin(), lvas.end(), lva);
    if (position != lvas.end())
    {
        lvas.erase(position);
    }
}

但LVA类必须有一个==运算符。

祝你好运。