2010-07-07 88 views
0

我试图从一个向量中移除一个元素。C++:从一个向量中移除项目时的困难

vector<Foo> vecFoo; 

Foo f1; 
Foo f2; 
Foo f3; 

vecFoo.push_back(f1); 
vecFoo.push_back(f2); 
vecFoo.push_back(f3); 

Foo* pF1 = &f1; 

vecFoo.erase(std::remove(vecFoo.begin(), vecFoo.end(), *pF1), vecFoo.end()); 

最后一行产生大量的C2784错误。我究竟做错了什么?

(是的,这个例子是有点做作,但实质是,我有一个指向向量的元素,我想删除该元素。)

回答

2

您是否缺少比较运算符?

class Foo 
{ 
    public: 
     bool operator==(Foo const& rhs) const { return true;} 

     ... Other stuff 
}; 
0

你没有指向元素的指针,因为push_back生成一个副本。你可以使用Foo* pF1 = &vecFoo[0];

假设这只是一个错字,你可以非常简单地得到一个元素的迭代器,因为向量迭代器是随机访问的。

vector<Foo>::iterator i = vecFoo.begin() + (pF1 - &vecFoo.front()); 
+0

也许我错过了一些东西,但只要Foo有一个比较运算符,你可以很好地比较f1(或者OP的例子中的* pF1)和它的实际存储在std :: vector中的副本... – 2010-07-07 19:47:17

+0

@Eugen,不,你不会错过任何东西,我对这个问题的结构有点困惑。我很想删除这个答案,但我仍然认为它可能有用;我对现实问题还不够了解。 – 2010-07-07 20:05:45

0

你超负荷Foooperator==

Foo有一个非平凡的析构函数,赋值运算符或复制构造函数,但不是全部三个?如果你定义一个,你必须全部定义它们。

即使您没有重载析构函数,赋值运算符或复制构造函数,其中一个Foo的成员也已声明为它的析构函数或赋值运算符或复制构造函数。