[英]C++ vector implementation - removing elements
我正在实现向量类型。 我完全不为算法或数据结构所困扰,但不确定删除方法。 例如:
bool Remove(Node* node)
{
/* rearrange all the links and extract the node */
delete node;
}
其中node是指向我们当前所在节点的指针。 但是,如果删除节点,那么如何防止这种情况发生:
Node* currentNode = MoveToRandNode();
Remove(currentNode);
cout << currentNode->value;
如果currentNode是指向指针的指针,则会更容易,但不是。
您可以在迭代器中添加另一个抽象级别(现在是原始指针),如果您不处理原始指针,而是创建某种迭代器类而不是指针,则可能会使迭代器无效,从而导致控制失败如果有人在删除迭代器后尝试访问它。
class Iterator {
Node operator*() {
if (node) return *node;
else throw Something();}
private:
Node* node;
}
当然,这种指针的包装将花费一些开销(检查每个解引用上的指针)。 因此,您将必须决定自己的演奏安全性。 为确保他人安全,请按照他人的建议包装文件。
先退后一步。 您需要定义谁“拥有”向量指向的内存。 是向量本身,还是使用该向量的代码? 定义此选项后,答案将很容易-Remove()方法应始终删除它,或者永远不要删除它。
请注意,您刚刚弄清了可能的错误的表面,回答“谁拥有它”将有助于解决其他可能的问题,例如:
好的,您不能这样做,但是对代码进行一些修改可以提高安全性。 添加参考
bool Remove(Node*& node)
{
/* rearrange all the links and extract the node */
delete node;
node = nullptr;
}
检查nullptr
if(currentNode)
cout << currentNode->value;
可能您需要尝试std :: shared_ptr
这类似于“迭代器无效”。 例如,如果您有一个std::list l
和std::list::iterator it
指向该列表,然后调用l.erase(it)
,则该迭代器it
无效-即,如果使用它以任何方式,您都会得到未定义的行为。
因此,在该示例之后,您应该在Remove方法的文档中包含以下内容:“指针node
无效,并且在该方法返回后可能不被使用或取消引用。”
(当然,您也可以只使用std :: list,而不必费心重新发明轮子。)
有关迭代器失效的更多信息,请参见: http : //www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf
另外,innochenti写了什么。 我认为您必须决定cout << currentNode->value;
预期/期望行为cout << currentNode->value;
:
node = nullptr
) value
具有一些默认value
),并在delete node;
做node=default_value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.