C ++:从向量中删除项目很困难

时间:2010-07-07 19:24:20

标签: c++ stl vector pointers

我正在尝试从矢量中删除元素。

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错误。我做错了什么?

(是的,这个例子有点人为,但实质上是我有一个指向向量中元素的指针,我想删除那个元素。)

3 个答案:

答案 0 :(得分:2)

您是否错过了比较运算符?

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

        ... Other stuff
};

答案 1 :(得分:0)

你没有指向元素的指针,因为push_back会复制。您可以使用Foo* pF1 = &vecFoo[0];

解决此问题

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

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

答案 2 :(得分:0)

您是否超载Foo的{​​{1}}?

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

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