1

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

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

经理.h

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

};

经理.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);
}
4

6 回答 6

1

如果我在此方法中使用对 LVA 对象的引用可以吗?

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

于 2013-07-10T16:52:42.967 回答
1

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

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

如何实现 RemoveLVA(LVA& lva)?

您将需要在矢量中找到对象。(您可以使用std::find()if operator==()is defined for 。)然后为您的向量LVA调用该函数。erase()

于 2013-07-10T16:53:56.827 回答
1

在不了解更多关于LVA的情况下,很难准确,但您可能想要一个 const 引用AddLva,因为您没有在函数中修改它(并且您可能想要传递一个临时值)。

对于删除:您必须定义某种等效函数,LVA而不是要删除匹配的元素。这可以是LVA::operator==,或其他一些对象或函数:在第一种情况下,您用于std::find查找位置,在第二种情况下,std::find_if. 如果向量可以包含多个匹配元素,您可能需要查看std::removeor std::remove_if

于 2013-07-10T16:54:24.370 回答
0

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

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

于 2013-07-10T16:52:51.607 回答
0

AddLva的,可以参考,尽管它通常会const参考:

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

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

于 2013-07-10T16:55:03.903 回答
0

是的,可以在 add 和 remove 方法中将 LVA 对象作为 ref 传递。您也可以将这些参数声明为“const”,因为我认为 add 和 remove 不会影响 object 。

对于删除方法

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 类必须有一个 == 运算符。

祝你好运。

于 2013-07-10T16:58:50.697 回答