1

我正在尝试删除对象向量中的元素。向量充满了实例,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 );
   }
}

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

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

4

4 回答 4

6

如果您的用例没有重复项,那么最好使用 anstd::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或比较函数或仿函数,实现严格的弱排序

于 2012-08-02T08:39:34.883 回答
4

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

#include <algorithm>
#include <string>
#include <vector>

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

这将删除"ghi"from的所有实例strVector

于 2012-08-02T08:42:37.763 回答
1

如果向量中的对象支持相等,并且这是删除的条件,那么您可以使用:

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

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

于 2012-08-02T09:31:36.013 回答
0
#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;
}
于 2012-08-02T08:44:43.440 回答