所以我有一個載體,像這樣:使用原始指針從矢量中刪除std :: unique_ptr的最佳方法?
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
小號引用同一個對象。 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引發了斷點。」在點擊繼續時我得到了一個調試斷言失敗。
所以顯然我做錯了什麼,但我不知道是什麼。使用原始指針從矢量中刪除智能指針的正確方法是什麼?
你有沒有考慮簡化了誰的只是不保持原始指針的矢量開始與問題,指定一個比較函數來獲取()原始指針? – 2013-02-28 01:07:00
'std :: unique_ptr'有一個返回擁有指針的'get'成員。 – 2013-02-28 01:07:13
呃,一個建議。還有另外一個名爲'std :: shared_ptr'的C++ 11智能指針。 – 2013-02-28 01:07:17