我有以下代码在向量中存储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);
}
答案 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::remove
或std::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类必须有一个==运算符。
祝你好运。