繁体   English   中英

C ++向量实现-删除元素

[英]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 lstd::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;

  • 错误-(如innochenti编写的node = nullptr
  • 默认值-创建节点devault_value(其value具有一些默认value ),并在delete node; node=default_value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM