删除矢量中的对象

Deleting an object in a vector

本文关键字:对象 删除      更新时间:2023-10-16

我正在尝试删除对象向量中的一个元素。向量中充满了Object的实例,在某个时刻,我想删除向量中的某个元素,而不是通过索引,而是通过元素本身。

一个简单的例子是:

std::vector< string > strVector;
strVector.push_back( "abc" );
strVector.push_back( "def" );
strVector.push_back( "ghi" ); // So strVector should contain "abc", "def", and "ghi"

如何从矢量中删除"ghi"?请注意,我不知道"ghi"在那个向量中的位置。

// Something like this. Assume strVector = [ "abc", "cba", "ccb", "bac", "aaa" ]
strVector.removeElement( "ccb" );

我正在研究的一个更相关的例子:

class MyClass {
   std::vector< Object > myObjVector;
   void main( ARGS ) {
      for ( int i = 0; i < 10; i++ ) {
         Object myObject = Object( );
         myObjVector.push_back( myObject );
      }
      int j = getANumber( ); // j could be any number within the size of the vector
      Object myOtherObject = myObjectVector.at( j );
      // How do I erase myOtherObject (which is an object inside the vector) ?
      removeFromVector( myOtherObject );
   }
}

我希望问题很清楚。提前谢谢。

编辑:我明白了,感谢所有回答的人。诀窍是给类一些唯一的东西来识别它(比如名称或标记,只要它们保证是唯一的),然后使用擦除-删除习惯用法从数组中删除对象。

如果您的用例没有重复,那么您最好使用std::set,并使用std::set::erase,它取一个值。

std::set< string > strSet;
strSet.insert( "abc" );
strSet.insert( "def" );
strSet.insert( "ghi" );
strSet.insert( "ccb" );
strSet.erase("ccb");

如果您需要处理重复项,则必须指定所需的删除行为。它应该删除与某个值匹配的一个或全部元素吗?你关心保留其余元素的顺序吗?如果你需要使用一个向量,那么请使用擦除-删除习惯用法。但请注意,std::vector::erase具有线性时间复杂度,而std::set::erase的相关变体具有对数时间复杂度。擦除-删除将删除所有等于给定值的元素。

注意:如果要将std::set用于用户定义的类型,则必须提供小于bool operator<(const UserType&) const的函数或函子,以实现严格的弱排序。

如果必须使用vector,则使用erase(remove()):

#include <algorithm>
#include <string>
#include <vector>
strVector.erase(std::remove(strVector.begin(), strVector.end(), "ghi"),
                strVector.end());

这将从CCD_ 10中移除CCD_ 9的所有实例。

如果向量中的对象支持相等,这就是条件要删除,则可以使用:

v.erase( std::remove( v.begin(), v.end(), "ghi" ), v.end() );

否则,您将需要remove_if,它带有一个函数对象(或lambda,如果您有C++11),如果要删除元素,则返回true。

#include <iostream>
#include <vector>
class Object
{
public:
    Object(int n){secret_num = n;}
    virtual ~Object(){}
    int getSecretNum(){return secret_num;}
private:
    int secret_num;
};
int main()
{
    int index= -1;
    Object *urobj = new Object(104);
    std::vector<Object*> urvector;
    for(int i = 0; i < 10; ++i)
    {
       Object *obj = new Object(i+1);
       urvector.push_back(obj);
    }
    urvector.push_back(urobj);
    for(int j = 0; j < urvector.size(); ++j)
    {
        Object *tmp = urvector.at(j);
        std::cout << tmp->getSecretNum() << std::endl;
        if(urobj == tmp)
            index = j; 
    }
    if(index == -1)
       std::cout << " not match " << std::endl;
    else 
       std::cout << " match " << index << std::endl;
    return 0;
}