获取双指针指向的对象

Posted

技术标签:

【中文标题】获取双指针指向的对象【英文标题】:Obtaining the object pointed to by a double pointer 【发布时间】:2014-10-27 04:41:25 【问题描述】:

如果我有一个迭代器list<Tree_Node*>::iterator iter,对于用户定义类Tree_Node,我如何通过迭代器返回Tree_Node* 指向的对象?它基本上是一个指向指针的指针,不是吗?

【问题讨论】:

【参考方案1】:

您取消引用迭代器以获取Tree_Node* 对象,然后取消引用该迭代器以获取Tree_Node

**iter

假设您有一个成员Tree_Node::x,您可以将其称为:

(**iter).x
(*iter)->x

它基本上是一个指向指针的指针,不是吗?

在 C++ 中,迭代器抽象旨在拥有一个类似于指针的 API……它们的实现方式并不重要,尽管对于许多容器来说它将是一个指针。

【讨论】:

对于我拥有的列表,我唯一一次添加内容是使用add() 函数。在函数中,我定义了一个 Tree_Node* 来添加它,它有一个名称,但我这样做只是为了避免使用 new 并且不必担心清理。在函数之外,这个名字没有任何意义。我计划使用for 循环访问列表的每个元素。由于我不能直接使用您提供的 (**iter).x 格式,我是否应该暂时将每个元素的迭代器指针(即Tree_Node*)分配给一个变量,以便我有一个可以使用的名称?或者有没有更好的方法在循环中做到这一点? 您可以执行类似for (auto& p : my_list) p->tree_node_operation(); 之类的操作 - 这样p 是每个连续迭代器值的名称,以便在循环中使用。【参考方案2】:

在 C++11 中,你会这样做:

for(auto node : tree)
    cout << node->data;

或者在旧版本中:

for(list<Tree_Node*>::iterator node = tree.begin(); node != tree.end(); node++)
    cout << (*node)->data;

【讨论】:

【参考方案3】:

它基本上是一个指向指针的指针,不是吗?

抽象是另一种方式:指针是一种特殊类型的迭代器(并且可能是迭代器建模的东西),而迭代器是一种抽象。但是你的结论是正确的,就像你可以做的指针一样:

list<Tree_Node*>::iterator iter;
// assign something to iter
Tree_Node* ptr = *iter;
Tree_Node& node = *ptr;

或简称:

Tree_Node& node = **iter;

【讨论】:

有趣。那么你能给我一个不是指针的迭代器的例子吗?这学期除了指针几乎什么都没用,很难想象另一种间接对象访问的方法。 @UnworthyToast:我们在这里使用的迭代器就是这样一个例子。 std::list&lt;T&gt; 实现了一个链表,因此它的每个节点都必须包含指向下一个和前一个元素的指针。此外,它们不能总是保存在连续的内存中。 std::list&lt;T&gt;::iterator 可能在内部使用指针,但是,例如取消引用不会给您列表的节点,而是给您保留的内容。 operator++() 不会增加内部指针,而是将其设置为在节点“next”字段中找到的指针。 啊哈!这一直让我感到困惑,但我想我现在明白了。所以你说的是迭代器只是一种以指针为模型的抽象数据类型,实际上它们通常是指针,只是带有额外的重载运算符。但即使它们本身不是指针,它们通常也是以某种方式依赖指针的结构,如这里的示例所示。我有这个权利吗? @UnworthyToast:是的,你明白了。不过,我不认为将运算符称为“重载”是正确的,因为它们中的大多数只是迭代器类的函数(是的,迭代器是一个特殊的类,为std::list 明确制作)。

以上是关于获取双指针指向的对象的主要内容,如果未能解决你的问题,请参考以下文章

指针 && 双指针

玩转双指针

如何根据它们指向的值对双指针数组进行排序?

链表和双指针框架

力扣刷题之双指针(C++)

算法双指针题解