だから私は次のようなベクトルを持っています:
std::vector<std::unique_ptr<SomeClass>> myVector;
次に、の生のポインターを含む別のベクトルがありますSomeClass
。
std::vector<SomeClass*> myOtherVector;
内部に要素があれば内部myOtherVector
にもあるので、各要素を調べてから同じ要素を削除しmyVector
たいと思います。次に、ベクトルをクリアします。これは私が思いついたものです:myOtherVector
myVector
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
myVector
これは、一意のポインターを保持しているため、コンパイル時エラーを生成しますが、remove()
関数に生のポインターを与えています。この問題を解決する適切な方法がわからないため、ここで助けが必要です。行を次のように変更しました。
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
std::unique_ptr
2 つの s が同じオブジェクトを参照しているため、これらすべての最初の部分は正しくありません。内部の要素にmyVector
は参照が含まれており、上記の行の一意のポインターの構築は別の参照です。そして、同じ型を取得するために新しいポインターを構築することが概念的にこれを行うための正しい方法であるかどうかさえわかりません。そこで、一意のポインターを共有ポインターに変更しました。
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
アプリケーションをmyVector.erase()
実行すると、「ApplicationName.exe がブレークポイントをトリガーしました」というランタイム エラーが発生しました。[続行] をクリックすると、デバッグ アサーション エラーが発生しました。
明らかに私は何か間違ったことをしているのですが、何が悪いのかわかりません。生のポインターを使用してベクトルからスマートポインターを消去する正しい方法は何ですか?