【问题标题】:C++ Remove object from vector [duplicate]C ++从向量中删除对象[重复]
【发布时间】:2015-02-03 01:04:06
【问题描述】:

我想从向量中删除一个元素。例如:

// object that is in the vector: MyClass obj;
// vector looks as so: vector<MyClass*> pVector;

pVector.remove(obj);

【问题讨论】:

  • pVector.pop_back() 怎么样?
  • @REACHUS 不幸的是,这删除了最后一个元素!我希望删除我作为参数传递的对象!
  • 在自己回答完这个问题后,看看我们有多少种方法可以做同样的事情很有趣...... :)
  • @REACHUS 对不起指针,我的意思是我作为参数传递的指针!
  • @KarlMorrison obj 是指针还是对象?

标签: c++


【解决方案1】:

这将完全基于指针删除对象。理想情况下,您应该为 MyClass 对象提供比较函数,实际上检查对象以查看它们是否相同。

pVector.erase(std::remove(pVector.begin(), pVector.end(), obj), pVector.end());

【讨论】:

    【解决方案2】:

    您的问题没有明确定义,但我将为您提供两个答案。我在这里根据您的代码假设obj 不是不是 指针,这意味着我们正在将对象与指向对象的指针进行比较。这需要一个自定义函子。

    第一个答案是如何删除向量中指向元素的值等于obj的所有元素。这假设有一个operator== 可以应用于MyClass 对象。

    pVector.erase(std::remove_if(pVector.begin(), pVector.end(),
                                 [&obj](MyClass * i) { return i && (*i == obj); }));
    

    如果找到,第二个将最多删除一个元素:

    auto e = std::find(pVector.begin(), pVector.end(),
                       [&obj](MyClass * i) { return i && (*i == obj); });
    
    if (e != pVector.end()) {
        pVector.erase(e);
    }
    

    lambda 语法需要 C++11。如果您无法访问 C++11,那么您将不得不手动构建一个仿函数:

    template <typename T>
    class pointer_is_equal_to_object
    {
    public:
        explicit pointer_is_equal_to_object(T const &);
    
        bool operator()(T const *) const;
    
    private:
        T const & value;
    }
    
    template <typename T>
    pointer_is_equal_to_object<T>::pointer_is_equal_to_object(T const & v) : value(v) {}
    
    template <typename T>
    bool pointer_is_equal_to_object<T>::operator()(T const * p) const
    {
        return p && (*p == value);
    }
    

    然后,例如,您可以使用:

    pVector.erase(std::remove_if(pVector.begin(), pVector.end(),
                                 pointer_is_equal_to_object<MyClass>(obj)));
    

    请注意,如果您停止使用指针而只使用std::vector&lt;MyClass&gt;,这种复杂性就会消失。然后你的operator==可以直接申请,你可以这样做:

    pVector.erase(std::remove(pVector.begin(), pVector.end(), obj));
    

    【讨论】:

      【解决方案3】:

      假设 C++11,并且您想要删除与 obj 匹配的任何元素,而不是确切的 obj... 但您应该能够从这里找出任何一种方式:)

      http://en.wikipedia.org/wiki/Erase-remove_idiom

      为了好玩,这里有一个例子:http://ideone.com/6ILYvo

      #include <algorithm>
      #include <vector>
      
      std::vector<MyClass*> v;
      MyClass * toberemoved = new MyClass();
      
      //v gets populated...
      
      auto itr = std::remove_if(v.begin(),v.end(), [&](MyClass* a){return *a == *toberemoved;});
      
      v.erase(itr,v.end());
      

      【讨论】:

      • 对于具有我想要评估的属性的对象,这是否也可以实现?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2018-12-11
      • 1970-01-01
      • 2014-05-05
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多