我有一個屬於管理構造的std::list<Value>
,每當調用工廠方法時都會提供Value *
指針。當需要銷燬Value
時,這些指針會傳回給管理器。但是,我不確定如何最好地使用這些指針來查找和刪除/刪除元素。從std :: list中刪除<Value>使用指向Value的原始指針?
class ValueManager{
public:
Value * createValue(ValueDef & def) {
m_valueList.push_back(Value(def));
return &m_valueList.back();
}
void destroyValue(Value * target) {
// Mystery!
// How does one remove/erase a list element
// with only a pointer to it's value?
}
private:
std::list<Value> m_valueList;
};
兩個::erase
和::remove
似乎生病適合的任務,一個使用一個迭代器,而不是一個指針,而後者則採用的全部價值,不能因爲做了,在這種情況下,不存在可接受== Values
之間的比較方法,只有指針可以可靠地用於查找目標。
我的問題是最有效的實施destroyValue()
可以承擔什麼?
你要返回的地址是* iterator *,而不是值。使用迭代器*本身*作爲返回值(除了真正的'std :: list <>'以外,不要試試這個)。 – WhozCraig 2013-03-18 00:49:55
@WhozCraig - 不知道我跟着,它返回存儲爲列表中最後一個元素的元素的地址,對不對?是的,我使用一個列表,因爲它不重新分配節點,使地址無效到內存。 – 2013-03-18 01:10:17
你應該返回'std :: list :: iterator'。在接收端使用它的語法與指針相同('* x'將使用迭代器的解引用操作符來獲取底層值)。訪問地址將需要小費('&(* x)'),但仍然可行。然而,現在你可以使用該迭代器作爲包含'std :: list '的基於迭代器的操作的直接輸入,例如'erase()'等。 –
WhozCraig
2013-03-18 01:14:12