2016-08-04 5 views
0

オブジェクトポインタを指すオブジェクトを削除せずに、オブジェクトポインタのベクトルから要素を削除する適切な方法は何ですか?C++:オブジェクトポインタを指すオブジェクトを削除せずにオブジェクトポインタのベクトルから要素を削除する適切な方法は何ですか?

私が選択的に指摘されているノードオブジェクトのいずれかを破壊することなく、私のベクトル

std::vector<Node*>openNodes; 

から要素を削除しようとしています。 (これらのノードは他の場所で使用されている。)

私ははstdとき、しかし、私自身のカスタムコンパレータ機能

bool CheckClosedNode(Node *tocheck) 
{ 
    if(tocheck->isOpen) 
     return false; //Don't remove. Node is still open. 
    else 
    { 
     //std::cout << "node " << tocheck->id << " is being removed from open list..." << std::endl; 
     return true; // Remove. Node is closed. 
    } 
} 

を使用してそう

std::remove_if(openNodes.begin(),openNodes.end(),CheckClosedNode); 

よう<アルゴリズム>のremove_if機能を使用してみました:: cout openNodesの内容は、何も削除されていません。私は、remove_if()と組み合わせてstd :: erase()を使うべきであることを読んだが、erase()はノードを削除する。私は削除する必要があるすべての要素をベクトルの前面に移動し、pop_front()を実行することを考えましたが、pop_frontも削除します。

オブジェクトを削除せずにベクトルから要素を削除する標準的な方法はありますか?

+3

std :: vector :: eraseのドキュメントを紛らわしかったです。削除された要素(あなたの場合はポインタ)が指摘していない要素を破棄します。 – Resurrection

答えて

4

ポインタの場合は、実際にノードを削除しません。新しいオブジェクトを使用してオブジェクトのメモリを割り当てるときは、ポインタを削除することがあなたの仕事です。今度はvector<Node>のように宣言していれば、消去はノード上のdeconstructorを呼び出さなければならないので、これは問題になります。しかし、ポインターは実際にはint型に似ています(メモリアドレスなので)。ベクトルからそれを削除すると、それが指すメモリに何も起こりません。

関連する問題