【问题标题】:C++: Difficulty with removing an item from a vectorC ++:难以从向量中删除项目
【发布时间】:2010-07-07 19:24:20
【问题描述】:

我正在尝试从向量中删除一个元素。

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

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

【问题讨论】:

    标签: c++ stl vector pointers


    【解决方案1】:

    您是否缺少比较运算符?

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

    【讨论】:

      【解决方案2】:

      您没有指向该元素的指针,因为 push_back 会创建一个副本。你可以用Foo* pF1 = &amp;vecFoo[0];来解决这个问题

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

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

      【讨论】:

      • 也许我遗漏了一些东西,但只要 Foo 有一个比较运算符,您就可以很好地将 f1 (或 OP 示例中的 *pF1 )与其实际存储在 std::vector 中的副本进行比较定义...
      • @Eugen,不,你没有遗漏任何东西,我对问题的结构有点困惑。我很想删除这个答案,但我仍然认为它可能有用;我对实际问题的了解还不够。
      【解决方案3】:

      你有没有超载Foooperator==

      Foo 是否有重要的析构函数、赋值运算符或复制构造函数,但不是全部三个?如果定义一个,则必须全部定义。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多