我有一个属于管理构造的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