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 );
   }
}

質問が明確であることを願っています。前もって感謝します。

編集:答えてくれたすべての人に感謝します。秘訣は、クラスを識別する一意のもの (一意であることが保証されている限り、名前やタグなど) をクラスに与えてから、erase-remove イディオムを使用して配列からオブジェクトを削除することでした。

4

4 に答える 4

6

ユースケースに重複がない場合は、値を取るstd::set::erasestd::setを使用することをお勧めします。

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

strSet.erase("ccb");

重複に対処する必要がある場合は、削除の望ましい動作を指定する必要があります。値に一致する要素の 1 つまたはすべてを削除する必要がありますか? 残りの要素の順序を維持することに関心がありますか? ベクトルを使用する必要がある場合は、erase-remove idiomでロックします。ただし、std::vector::eraseは時間の複雑さが線形であるのに対し、 の関連するバリアントはstd::set::erase時間の複雑さが対数であることに注意してください。また、erase-remove は、指定された値に等しいすべての要素を削除します。

: ユーザー定義型に を使用する場合は、厳密な弱い順序付けをstd::set実装して、より少ないかbool operator<(const UserType&) const比較関数またはファンクターを提供する必要があります。

于 2012-08-02T08:39:34.883 に答える
4

を使用する必要がある場合は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の場合は、要素が削除される場合に true を返す機能オブジェクト (C++ 11 の場合はラムダ) が必要です。

于 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 に答える