0

私は2つのポインターのベクトルを持っています:arrそれはすでにいくつかの要素を含み、そしてtemp、私が特定の要素をコピーしたい新しいベクトルですarr。たとえば、の2番目の要素をコピーして、arrにコピーしtempて削除したいとしarrます。どのようにそれを行うことができますか?

私はこれを試しましたが、良くありません:

void deleteobject(vector < figure3d *> &arr,int index,vector < figure3d *> &temp)
{
     vector < figure3d * > :: iterator i=arr.begin();
     temp.insert(temp.begin(),*i);
     delete *i;
     arr.erase(i);
     temp[0]->print();
}
4

4 に答える 4

1

delete保持したいので、コピーしているオブジェクトをコピーするべきではありませtempん。erasearr

于 2012-06-01T22:31:07.150 に答える
0

arr.begin()最初の要素を指すイテレータを提供するので、2番目の要素が必要な場合は、i1つ進める必要があります。

++i;

th要素が必要な場合は、次のindexように進める必要がありiますindex

i += index;

生のポインタをベクトルに格納し、ベクトルからそれらを削除するときにそれらを削除することを忘れないようにする必要があるのは、発生するのを待っているメモリリークです。また、別の回答で言及されているass molbdniloでは、tempがポインタを持っているオブジェクトを削除しているため、実際にはメモリ処理エラーが発生します。

于 2012-06-01T22:35:27.853 に答える
0

私が理解していることから、指定されたインデックス(引数index)の要素をコピーして、それをベクトルから削除したいと思いますtemp。この関数は次のように単純に見える可能性があります。

void deleteobject(std::vector<figure3d*> &arr, int index, std::vector<figure3d*> &temp)
{
    temp.insert(temp.begin(), arr[index]);
    arr.erase(arr.begin() + index);
}

この場合、オブジェクト自体をコピーするのではなく、オブジェクトへの参照のみをコピーします。したがって、このオブジェクトが格納されているメモリを解放する必要はありません。

delete *i;また、関数では、が指すオブジェクトが格納されているメモリを解放する呼び出しを行うことに注意してください。i格納されているポインタは、すでに解放されているメモリを指しているため、 arr無効になります(ダングリングポインタ)。

また、オブジェクトへのポインタのベクトルではなく、オブジェクトのベクトルを使用することをお勧めします。要素はコピーされますが、通常は十分に高速であり、それに関連する面倒なメモリ管理はありません。また、ポインターのベクトルを使用する正当な理由がある場合(C ++でポインターを使用する場合)、代わりにスマートポインターのベクトルを使用することをお勧めします。TR1またはC ++ 11をサポートしている場合は、を使用しstd::shared_ptr、それ以外の場合はboost::shared_ptrshared_ptrはどこにありますか?

于 2012-06-01T22:35:31.953 に答える
0

これは仕事のようです!
このようなことは私がすることです:

Class removePredicate{
Public: 
    bool operator() (figure3d** item) {
       //remove logic goes here
    }
};

remove_copy_if(arr.begin(), arr.end(), back_inserter(tmp), not1(removePredicate));

これにより、削除するすべての要素がtmpにコピーされます。arrから実際にそれらを削除するには、remove-eraseイディオムの単純なアプリケーションです。

erase(remove_if(arr.begin(), arr.end(), not1(removePredicate)), arr.end());

これらの2つのステップを1行にまとめる方法はおそらくありますが、ある時点で読みやすさが失われるリスクがあります。

于 2012-06-01T22:47:35.313 に答える